我已经阅读了有关该主题的多个答案,看起来我的配置应该正常工作,但由于某种原因它没有。基于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'这样的例子搞糊涂了。我想我会在所有回复尝试都用尽时从消息恢复器中发回部分序列化的异常。从处理程序返回对象而不是异常将不会触发所需的重试。谢谢,这有很多帮助,现在可以使用! –