1

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

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

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

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

谢谢..........

4

1 回答 1

3

已死信的消息有一个x-death标题,其中详细说明了它经过了哪些队列以及经过了多少次。请参阅RabbitMQ 网站上有关死信交换的文章。

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

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

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

于 2016-03-30T13:54:41.363 回答