如何在RabbitMQ死信队列中指定附加信息

5
我有一个兔子队列,其中包含待消费的消息。我还有一个可能失败的监听器。该队列配置了死信交换(以及死信队列)。我想要的是在死信队列中看到消息中的异常信息。
目前的工作方式如下:
  1. 我向我的正常队列发送一条损坏的消息。
  2. 我的监听器(我使用Java的org.springframework.amqp.core.MessageListener)失败,并显示类似于:“java.lang.RuntimeException:corrupted message”的内容。
  3. 该消息被拒绝并通过死信交换进入死信队列。
  4. 当我查看Rabbit管理界面中的死信消息时,我看到: headers:
    x-death:
    reason: rejected
但我想要的是在UI上看到“java.lang.RuntimeException:corrupted message”。我假设它应该是自定义标头?
例如,在我的监听器中放置通用try-catch并增强标题以包含异常信息是否可行?
1个回答

7
抱歉,RabbitMQ(实际上是AMQP规范)没有提供消费者增强被拒绝消息的机制。该协议仅支持确认或拒绝消息。
Spring AMQP与重试拦截器一起提供了一种机制,可以将带有其他信息的消息重新发布到不同的队列(可以是DLQ相同的队列),并在标头中添加其他信息(异常堆栈跟踪等)。
请参见“异步侦听器中的错误处理”部分中的RepublishMessageRecoverer。链接:RepublishMessageRecoverer

3
我也使用这种模式。我喜欢将basic.reject和/或未发送basic.ack视为消费者崩溃或遇到与消息或下游无关的其他问题的指示。在这种情况下,经纪人可以适当地将消息不变地重新排队,并允许另一个消费者立即接收它。如果消费者进程足够健康,可以向消息标头写入有意义的信息,那么最好将其重新发布到“无法传递”或“重试”交换并确认原始消息。 - Ryan Hoegg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接