【问题标题】:How to specify additional info on a rabbit message when it's dead lettered死信时如何在兔子消息上指定附加信息
【发布时间】:2016-02-21 23:35:03
【问题描述】:

我有一个兔子队列,里面有消息供消费。我也有一个可能会失败的听众。该队列配置有死信交换(连同死信队列)。我想要的是在死信队列中的消息中查看异常信息。

这是它目前的工作方式:

  1. 我将损坏的消息发送到我的正常队列。
  2. 我的侦听器(我正在使用 Java 的 org.springframework.amqp.core.MessageListener)失败,并显示如下内容:“java.lang.RuntimeException: 已损坏消息”
  3. 消息被拒绝并通过死信交换进入死信队列。
  4. 当我查看 Rabbit 管理 UI 中的死信消息时,我看到: 标题:
    x-死亡:
    原因:拒绝

但我想要的是在 UI 的某处看到“java.lang.RuntimeException:损坏的消息”。我认为它应该是一个自定义标题?

例如,是否可以为我的侦听器添加一个通用的 try-catch 并使用异常信息增强标头?

【问题讨论】:

    标签: java rabbitmq spring-amqp spring-rabbit rabbitmq-exchange


    【解决方案1】:

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

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

    RepublishMessageRecoverer in the section about error handling with asynchronous consumers

    【讨论】:

    • 这也是我使用的模式。我喜欢将 basic.reject 和/或发送 basic.ack 失败视为消费者崩溃或遇到与消息或任何下游无关的其他问题的迹象。在这种情况下,代理将消息重新入队并允许另一个消费者立即接收它是合适的。如果消费者进程足够健康,可以将敏感信息写入消息标头,它不妨将其重新发布到“无法投递”或“重试”交换器,并基本确认原始消息。
    猜你喜欢
    • 2015-04-22
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多