我一直在尝试找到一种为所有@RabbitListener设置重试机制的方法。我已经尝试过这些属性:

listener:
  auto-startup: true
  concurrency: 1
  max-concurrency: 1
  retry:
    enabled: true
    initial-interval: 1000
    max-attempts: 3
    max-interval: 10000
    multiplier: 2
    stateless: true


它可以正常工作,唯一的问题是消息没有发送错误。我唯一的问题是,为了将消息发送到特定的DLQ,我必须更改队列以添加参数x-dead-letter-exchangex-dead-letter-routing-key,这是我要避免的事情。

所以我的问题是:


有没有一种方法可以以编程方式指定在耗尽尝试后无需重新创建队列的情况下消息应该去的DLQ?不使用参数x-dead -...


我正在使用Spring Boot 1.4.0.RELEASE。

最佳答案

不通过属性。

您必须使用自己的重试拦截器(由RetryInterceptorBuilder构建)覆盖侦听器容器工厂的建议链,而不是注入

builder.recoverer(new RejectAndDontRequeueRecoverer());


您需要注入适当配置的RepublishMessageRecoverer-并发布到您选择的交换位置,它会在消息标题中添加其他信息(堆栈跟踪等)。

请参阅SimpleRabbitListenerContainerFactoryConfigurer以了解默认拦截器是built from the properties的方式。

this section of the Spring AMQP docs中讨论了重新发布的恢复程序。

08-07 03:02