RabbitMQ,如何在重新排队尝试后删除消息

时间:2016-03-30 10:48:22

标签: java rabbitmq rabbitmq-exchange

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

现在出现问题,我正在以json字符串的形式向Original_Exch发布消息,该字符串包含电子邮件信息(例如To,Subject,Message body,attachment等)。从队列绑定到Original_exch消费此消息后,我将电子邮件发送到指定的电子邮件地址。如果电子邮件未成功发送,我将此消息传输到Dead_Exch,2秒后(使用TTL),消息将再次传输到Original_Exch。

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

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

由于..........

1 个答案:

答案 0 :(得分:2)

已经死信的邮件有一个x-death标题,其中包含有关它经过的队列和次数的详细信息。请参阅RabbitMQ网站上的article about dead-letter exchanges

因此,您可以使用此标头执行您想要的操作。我看到两个解决方案:

  • 在您的消费者中,当无法发送邮件时,请查看x-death标题并确定是否要将其写入死信(Basic.Nack并将requeue设置为false)或删除它(Basic.Ack)。
  • 使用Dead_Exch的标头交换类型,并配置绑定以匹配x-death

由于标头交换只对标头值进行精确匹配,因此第一种解决方案更灵活,更不容易出错。