Java 如何在兔子消息';这是死信

Java 如何在兔子消息';这是死信,java,rabbitmq,spring-amqp,spring-rabbit,rabbitmq-exchange,Java,Rabbitmq,Spring Amqp,Spring Rabbit,Rabbitmq Exchange,我有一个兔子队列,里面有消费信息。我还有一个可能失败的倾听者。队列配置为死信交换(以及死信队列)。我想要的是在死信队列中的消息中看到异常信息 以下是它目前的工作原理: 我将损坏的消息发送到我的正常队列 我的监听器(我正在使用Java的org.springframework.amqp.core.MessageListener)失败,出现类似“Java.lang.RuntimeException:损坏的消息”这样的错误 消息被拒绝,并通过死信交换进入死信队列 当我在Rabbit Admin UI中查

我有一个兔子队列,里面有消费信息。我还有一个可能失败的倾听者。队列配置为死信交换(以及死信队列)。我想要的是在死信队列中的消息中看到异常信息

以下是它目前的工作原理:

  • 我将损坏的消息发送到我的正常队列
  • 我的监听器(我正在使用Java的org.springframework.amqp.core.MessageListener)失败,出现类似“Java.lang.RuntimeException:损坏的消息”这样的错误
  • 消息被拒绝,并通过死信交换进入死信队列
  • 当我在Rabbit Admin UI中查看死信消息时,我看到: 标题:
    x-死亡:
    理由:拒绝
  • 但我想看到的是UI上的某个地方出现“java.lang.RuntimeException:损坏的消息”。我想它应该是一个自定义标题

    例如,是否可以将一个常规的try捕获放在我的侦听器中,并使用异常信息增强标题

    No;RabbitMQ(实际上是AMQP规范)没有为使用者提供使用附加信息增强被拒绝消息的机制。该协议仅支持确认或拒绝消息

    Spring AMQP与重试拦截器一起提供了一种机制,可以将消息重新发布到不同的队列(可以与DLQ相同),并在消息头中添加额外信息(异常堆栈跟踪等)


    请参阅。

    这也是我使用的模式。我喜欢将basic.reject和/或未能发送basic.ack视为消费者崩溃或出现与消息或任何下游内容无关的其他问题的迹象。在这种情况下,代理可以原封不动地重新获取消息,并允许另一个使用者立即获取消息。如果使用者进程足够健康,可以将合理的信息写入消息头,那么它还可以将其重新发布到“无法传递”或“重试”exchange,并对原始消息进行basic.ack。