Rabbitmq - 从所有未经处理的消息中清除队列

时间:2014-08-04 08:10:18

标签: rabbitmq

我的开发环境中有成千上万条未经处理的消息,我无法重启 有没有办法删除(清除)所有邮件,即使它们未被确认?

8 个答案:

答案 0 :(得分:26)

关闭unacked消息所在的通道,将其重新放回队列,然后调用purge。

答案 1 :(得分:10)

您必须让消费者ack成为他们(或nack),然后才会删除他们。或者,您可以关闭使用者并完全清除队列。

如果您正在寻找某种方法来清除所有未经处理的消息 - 在RabbitMQ中既没有这样的功能也没有AMQP协议。

看起来你的消费者是问题的原因,所以你必须调整它(重写)以在处理或失败后立即发布消息。

答案 2 :(得分:2)

队列中没有“就绪”消息后,将其删除并重新创建。

答案 3 :(得分:1)

您需要调用basic.recover以强制所有未经处理的消息重新入队到失败的频道。请注意有关此函数的勘误表,指定RabbitMQ仅支持重新排队模式。

答案 4 :(得分:0)

您需要先将消息放回队列,然后才能清除它们:

作为替代方案,这不需要等待:

  • delete并重新创建队列
  • 重启服务器

答案 5 :(得分:0)

对于软件开发人员,请使用以下代码。

channel.purgeQueue(queue-name);

如果我们使用此代码,则将清除队列,并且将存在相同的队列。

答案 6 :(得分:0)

发生这种情况的一种方法是,如果使用者由于处理错误而无法回收相同的消息。在这种情况下,the RabbitMQ queue management interface可能会将消息显示为 Unacked ,但实际上是从队列中读取消息并对其进行处理(直至失败),然后重新排队(以便重试)。很快-每秒可能数千次

在此循环中,消息短暂地以 Ready 状态存在,但是您的应用程序立即将其再次删除-循环再次开始。例如,this auto-requeue behavior is the default for Spring AMQP.

由于消息永远不会处于“就绪”状态,因此管理接口的“获取消息” 按钮不太可能起作用。如果您具有队列访问权限,则可以运行一个单独的自定义使用者实例(也许在本地),但其具体目的是删除而不重新排队有问题的消息。

通过RabbitMQ的Fair Dispatch机制,您的其他使用者将可能收到有问题的消息,并有机会执行您的自定义处理。

您甚至可以编写一个自定义实用程序来执行此操作,并使用逻辑来过滤,分析或死信感兴趣的消息。

答案 7 :(得分:-4)

如果要清除队列的内容,则可以使用AMQP方法queue.purge:AMQP中有队列清除:http://www.rabbitmq.com/amqp-0-9-1-reference.html#queue.purge

您可以使用管理插件执行类似操作。

相关问题