2017-10-11 99 views
1

有时候由于一些外部的问题,我需要通过basic.reject重新发送requeue = true消息。以后如何恢复被拒绝的邮件,RabbitMQ

但我不需要立即使用它,因为它可能会在短时间内再次失败。如果我继续要求,这可能会导致无限循环和重复。

  1. 所以我以后需要使用它,说一分钟后,

  2. ,我需要知道这些消息多少次已经重新排队,这样我可以停止重新排队,但只有它拒绝给声明它不能使用。

PS:我正在使用Java客户端。

+0

关于你的第二个问题。您可以为消息本身添加计数器。 – talex

回答

0

有多种解决方案,以指向1.

第一个是由Celery选择的一个(即可以使用的RabbitMQ作为经纪人一个Python生产者/消费者库)。在消息内部,添加应执行任务的时间戳。当你的消费者得到消息时,不要检查它并检查它的时间戳。一旦达到时间戳,工作人员就可以执行任务。 (请注意,工作人员可以继续处理其他任务而不是等待)
此技术有一些缺点。您必须将每个通道的QoS增加到任意值。如果您的工作人员已经在处理长时间运行的任务,则延迟任务将不会执行,直到第一个任务完成。

第二种技术是RabbitMQ-only,更加优雅。它利用了dead-letter exchangesMessages TTL。你创建一个不被任何人使用的新队列。这个队列有一个死信交换,将消息转发到消费者队列。当你想推迟一条消息时,从消费者队列中确认(或拒绝它),然后将消息复制到死信队列中,TTL等于你想要的延迟(比如说一分钟后)。在(大致)TTL结束时,被拒绝的消息将神奇地降落到消费者队列中,准备好被消费。 RabbitMQ团队也制作了Delayed Message Plugin(这个插件被标记为experimental yet fairly stable and potential suitable for production use as long as the user is aware of its limitations,并且在故障转移的情况下在可扩展性和可靠性方面存在严重限制,因此您可能会决定是否真的想在生产中使用它,或者如果您更愿意坚持手动方式,每个队列限制为一个TTL)。

第2点。只需要在您的消息中添加一个计数器并在您的应用程序中处理这个计数器。您可以选择将此计数器放在标题中或直接放在正文中。

相关问题