有没有办法计算作业重新排队的次数(通过拒绝或Nak)而无需手动重新排除作业? 我需要为'&n;时间然后在' n'之后放弃时间。
ps:目前我手动重新排队作业(删除旧作业,创建具有确切内容的新作业,如果计数器不存在或者值小于' n')则需要额外的计数器标题
答案 0 :(得分:15)
当邮件重新传递一次或多次时,有redelivered
条消息属性设置为true。
如果您想跟踪重新传递计数或保留redelivers数量(也就是IP堆栈中的跃点限制或ttl),您必须将该值存储在邮件正文或标题中(字面意思 - 使用消息,修改它然后将其发布修改回经纪人)。
也有类似的问题和答案可能会对您有所帮助:How do I set a number of retry attempts in RabbitMQ?
答案 1 :(得分:4)
如果邮件实际上是死信,您可以检查x-death
邮件标题的内容。
例如,当reject
/ nack
与requeue = false
并且队列有相关的死信交换时,就会出现这种情况。
在这种情况下,此标头的内容是一个数组。每个元素都描述了一次失败的传递尝试,其中包含诸如传递尝试的时间,路由信息等信息。
这适用于RabbitMQ - 我不知道它是否适用于AMQP。
修改强>
由于我最初编写此答案,x-death
标题结构已更改。
标题更改格式通常是一件非常糟糕的事情,但是 在这种特殊情况下,原因是如果邮件连续死信,邮件大小将无限增长。
因此我删除了以前用于获取消息死亡数量的代码。
仍然可以从新的标题格式中获取死亡人数。