【发布时间】:2020-07-19 10:35:34
【问题描述】:
我们的应用程序中使用了 RabbitMq 时间累积了数百条消息,几个队列处于未确认状态,并且 TTL 无法正常工作,因为在侦听器不活动时发生了几次意外关闭。
现在出于业务原因,我不能只清空队列。 我想手动将未确认的消息推送到就绪状态。
有吗??
谢谢!
【问题讨论】:
我们的应用程序中使用了 RabbitMq 时间累积了数百条消息,几个队列处于未确认状态,并且 TTL 无法正常工作,因为在侦听器不活动时发生了几次意外关闭。
现在出于业务原因,我不能只清空队列。 我想手动将未确认的消息推送到就绪状态。
有吗??
谢谢!
【问题讨论】:
有两种方法可以将消息从未确认状态移动到就绪状态:
1) 确认来自消费者的消息
2) 关闭保持打开状态的消费者
很可能,选项#1 并不是一个真正的选项。当消息被卡在 unack'd 时,通常是因为消费者失去了对消息的跟踪,无法再确认它。
这通常会留下 #2:您需要关闭之前附加到该队列的所有消费者。当消息未被确认并且消费者掉线时,RMQ 会将消息推送回就绪状态。
如果您关闭您的消费者并重新启动它们会使消息回到未确认状态,那么您需要找出导致消费者错误的原因,修复代码并重新启动它。
【讨论】:
另一种方法是简单地重新启动 rabbitmq 实例。
/etc/init.d/rabbitmq-server restart
【讨论】:
Args.nack = function(tag, allUpTo, requeue)
所以,当你执行 nack 时,关键是传递 true 到 requeue 参数。
【讨论】: