RabbitMQ(以及AMQP协议)中没有类似重试try 的功能.
实施重试try 限制行为的可能解决方案:
重新传递消息,如果之前没有重新传递(判断basic.deliver
方法上的redelivered
参数-您的库应该有一些接口),将其丢弃,然后捕捉到dead letter exchange,然后以某种方式进行处理.
每次无法处理消息时,将其再次发布,但要设置或递增/递减标题字段,例如x-redelivered-count
(不过,您可以 Select 任何喜欢的名称).在这种情况下,为了控制重新交付,您必须判断您设置的字段是否达到某个限制(顶部或底部-0是我的 Select ,tcp/ip的ip头中的a-la ttl
).
将邮件唯一键(比如UUID,但发布邮件时必须手动设置)存储在Redis、Memcache或其他存储中,即使在MySQL中也是如此,同时还会进行重新投递计数,然后在每次重新投递时递增/递减此值,直到达到限制.
(对于真正的极客)编写插件,实现你想要的行为.
#3的优点是重新传递的消息保持在队列头.如果你有很长的队列,或者消息顺序对你很重要,这一点很重要(请注意,重新发送将打破严格的消息顺序,请参阅官方文档了解详细信息或this question on SO).
P.S.:
在这个主题中有similar answer个,但是在php中.通读一遍,也许它对你有点帮助(从单词"There are multiple techniques to deal with cycle redeliver problem"开始阅读).