RabbitMQ:如何使用计数器重新排队消息

时间:2014-08-10 06:14:54

标签: go rabbitmq amqp

有没有办法计算作业重新排队的次数(通过拒绝或Nak)而无需手动重新排除作业? 我需要为'&n;时间然后在' n'之后放弃时间。

ps:目前我手动重新排队作业(删除旧作业,创建具有确切内容的新作业,如果计数器不存在或者值小于' n')则需要额外的计数器标题

2 个答案:

答案 0 :(得分:15)

当邮件重新传递一次或多次时,有redelivered条消息属性设置为true。

如果您想跟踪重新传递计数或保留redelivers数量(也就是IP堆栈中的跃点限制或ttl),您必须将该值存储在邮件正文或标题中(字面意思 - 使用消息,修改它然后将其发布修改回经纪人)。

也有类似的问题和答案可能会对您有所帮助:How do I set a number of retry attempts in RabbitMQ?

答案 1 :(得分:4)

如果邮件实际上是死信,您可以检查x-death邮件标题的内容。

例如,当reject / nackrequeue = false并且队列有相关的死信交换时,就会出现这种情况。

在这种情况下,此标头的内容是一个数组。每个元素都描述了一次失败的传递尝试,其中包含诸如传递尝试的时间,路由信息等信息。

这适用于RabbitMQ - 我不知道它是否适用于AMQP。

修改

由于我最初编写此答案,x-death标题结构已更改。

标题更改格式通常是一件非常糟糕的事情,但是 在这种特殊情况下,原因是如果邮件连续死信,邮件大小将无限增长。

因此我删除了以前用于获取消息死亡数量的代码。

仍然可以从新的标题格式中获取死亡人数。