我已經閱讀了有關該主題的多個答案,看起來我的配置應該正常工作,但由於某種原因它沒有。基於Spring Boot的應用程序中的死信路由
這裏是配置:
@Bean Queue intakeQueue(String name) { return new Queue(name, true); }
@Bean Exchange dlx(String name) { return new DirectExchange(name); }
@Bean Queue dlq(String name) { return new Queue(name, false, false, true); }
@Bean
Binding dlb(Exchange dlx, Queue dlq, Queue reply) {
return BindingBuilder.bind(dlq).to(dlx).with(reply.getName()).noargs();
}
@Bean
Queue replyQueue(String name, Exchange dlx) {
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", dlx.getName());
args.put("x-dead-letter-routing-key", name);
return new Queue(name, true, false, false, args);
}
RabbitMQ的UI顯示,應答隊列具有DLX
DLK
和屬性。
我發送消息等
this.rabbit.convertSendAndReceive(intakeQueue, obj, message -> {
message.getMessageProperties().setPriority(10);
return message;
});
消息處理程序拋出AmqpRejectAndDontRequeueException
它接收到消息之後立即。這僅僅是爲了測試而完成的。我已經開始使用重試建議,但由於它沒有產生任何結果,我簡化了測試用例。
public Object handleMessage(Object obj) throws IOException {
throw new AmqpRejectAndDontRequeueException("Testing retries!");
}
有兩個問題我現在看到的:ARADRE已經拋出後DLQ
- 消息一直沒有出現。如果我直接從
handleMessage
發佈到DLQ,它的確如此。 convertSendAndReceive
不收回任何東西(例外也許?),並等待,直到超時發生,這是5分鐘在我的情況。它可能是有意的,但對於RPC風格的調用來說,這很奇怪。
我是否錯過或錯誤配置了某些東西?
好的,所以這是DLQ的攝入量而不是回覆。我想我被DLQ配置爲回覆的'FixedReplyQueueDeadLetterTests.java'這樣的例子搞糊塗了。我想我會在所有回覆嘗試都用盡時從消息恢復器中發回部分序列化的異常。從處理程序返回對象而不是異常將不會觸發所需的重試。謝謝,這有很多幫助,現在可以使用! –