我正在尝试使用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。
对于几乎相似的问题有很多答案,但没有一个是令人满意的(从学习者的角度来看)。
由于..........
答案 0 :(得分:2)
已经死信的邮件有一个x-death
标题,其中包含有关它经过的队列和次数的详细信息。请参阅RabbitMQ网站上的article about dead-letter exchanges。
因此,您可以使用此标头执行您想要的操作。我看到两个解决方案:
x-death
标题并确定是否要将其写入死信(Basic.Nack并将requeue
设置为false)或删除它(Basic.Ack)。Dead_Exch
的标头交换类型,并配置绑定以匹配x-death
。由于标头交换只对标头值进行精确匹配,因此第一种解决方案更灵活,更不容易出错。