【问题标题】:RabbitMQ, How to drop a message after n re-queuing attemptRabbitMQ,如何在重新排队尝试后删除消息
【发布时间】:2016-07-18 07:46:01
【问题描述】:

我正在尝试通过使用 RabbitMQ 和 JAVA 来构建一种异步服务器。我有两个交易所 Original_Exch 和 Dead_Exch,每个都有一个队列。两个交换都被声明为 DLX(彼此队列的死信交换)。

现在问题来了,我以 json 字符串的形式向 Original_Exch 发布了一条消息,其中包含电子邮件信息(例如收件人、主题、消息正文、附件等)。从绑定到 Original_exch 的队列中使用此消息后,我正在向指定的电子邮件地址发送电子邮件。如果电子邮件未成功发送,我会将此消息传输到 Dead_Exch,2 秒后(为此使用 TTL),该消息将再次传输到 Original_Exch。

让我们假设一个特定的消息由于连续失败而从一个交换移动到另一个交换的场景。在这种情况下,我想确保如果它已被转移到 Original_Exch 10 次,它应该从队列中永久删除(删除)并且不应该转移到 Dead_Exch。

几乎类似的问题有很多答案,但没有一个是令人满意的(从学习者的角度来看)。

谢谢…………

【问题讨论】:

    标签: java rabbitmq rabbitmq-exchange


    【解决方案1】:

    已死信的消息有一个x-death 标头,其中包含有关它经过的队列和次数的详细信息。在 RabbitMQ 网站上查看article about dead-letter exchanges

    所以你可以使用这个标题来做你想做的事。我看到了两种解决方案:

    • 在您的消费者中,当邮件无法投递时,查看x-death 标头并决定是要死信(Basic.Nack 将requeue 设置为false)还是丢弃它(Basic.Nack)。确认)。
    • Dead_Exch 使用标头交换类型并配置绑定以匹配x-death

    因为头部交换只对头部值进行精确匹配,所以第一种解决方案更灵活,更不容易出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多