spring-boot - @RabbitListener 的重试配置以编程方式指定死信队列

标签 spring-boot spring-amqp spring-rabbit

我一直在努力寻找一种方法来为所有 @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 这是我想避免的事情。

所以我的问题是:

  1. 有没有办法以编程方式指定哪个是DLQ,在尝试次数用尽后消息应该去往哪里而不重新创建队列? 不使用参数 x-dead-...

我正在使用 Spring Boot 1.4.0.RELEASE。

最佳答案

不是通过属性。

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

builder.recoverer(new RejectAndDontRequeueRecoverer());

您需要注入(inject)适当配置的 RepublishMessageRecoverer - 以及发布到您选择的交换,它会向消息 header 添加额外信息(堆栈跟踪等)。

查看 SimpleRabbitListenerContainerFactoryConfigurer 以了解默认拦截器是如何 built from the properties .

重新发布恢复器在 this section of the Spring AMQP docs 中讨论。 .

关于spring-boot - @RabbitListener 的重试配置以编程方式指定死信队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39281842/

相关文章:

rabbitmq - 如何在Spring AMQP中使用Ack或Nack

java - Spring RabbitMQ 监听器返回一个以逗号分隔的 ASCII 小数字符串

java - Spring AMQP错误: Listener method could not be invoked with the incoming message

spring-rabbit - Spring数据rabbitmq @RabbitListener突然停止消费排队消息

Websockets 返回状态 500 错误的 Java Spring Boot 项目

spring-boot - Spring Boot 中通过 RabbitMQ 发送-接收集合

java - 是否可以使用 Java 应用程序将 JSON 对象传递给 RabbitMQ 队列?

java - Hibernate 序列在更新期间不会为主键 id 生成连续的数字

java - 应用程序无法启动

java - 如何在 spring-boot 应用程序中为 Apache Tomcat 中的 AccessLogValve 设置属性 requestAttributesEnabled?