【发布时间】:2016-02-24 10:37:20
【问题描述】:
我已经阅读了有关该主题的多个答案,似乎我拥有的配置应该可以正常工作,但由于某种原因它不能正常工作。
这里是配置:
@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 风格的调用来说,这很奇怪。
我是否遗漏或配置错误?
【问题讨论】:
标签: spring-amqp dead-letter spring-rabbit