RabbitMQ—在没有任何使用者的队列上删除未确认的消息

RabbitMQ—在没有任何使用者的队列上删除未确认的消息,rabbitmq,queue,message,Rabbitmq,Queue,Message,我们在RabbitMQ中有一个备份队列,它只保留旧消息的副本供人使用。此队列上没有使用者,查看消息的唯一方法是使用Get messages UI/API 问题是,其中一个用户试图在启用重新查询的情况下获取超过24k条消息,而队列进入了错误状态 目前我看到有24k条未确认的消息,但我在队列中没有任何消费者 此时我只想清除队列以清除旧消息,但无法清除未确认的消息。由于没有消费者,我不知道我可以关闭的任何连接会将消息移回就绪状态 我是否可以执行任何管理操作来清空此队列的内容? 如果没有,在这一点上我可

我们在RabbitMQ中有一个备份队列,它只保留旧消息的副本供人使用。此队列上没有使用者,查看消息的唯一方法是使用Get messages UI/API

问题是,其中一个用户试图在启用重新查询的情况下获取超过24k条消息,而队列进入了错误状态

目前我看到有24k条未确认的消息,但我在队列中没有任何消费者

此时我只想清除队列以清除旧消息,但无法清除未确认的消息。由于没有消费者,我不知道我可以关闭的任何连接会将消息移回就绪状态

我是否可以执行任何管理操作来清空此队列的内容? 如果没有,在这一点上我可以做些什么来将消息移回就绪状态

编辑:关于此主题的其他类似问题都有消费者,而我没有,因此他们的解决方案不适用于我。因此,我为什么要把这当作一个新问题来提出

多谢各位

我是否可以执行任何管理操作来清空此队列的内容

对。只需删除并重新声明队列。管理控制台中应该有一个按钮为您执行此操作,然后您必须手动重新声明它并将其重新绑定到exchange。如果担心丢失其他消息,可以在删除旧队列之前使用其他名称声明新队列

由于没有消费者,我不知道我可以关闭的任何连接会将消息移回就绪状态

这是一个艰难的过程。获取消息的管理命令应该立即“nack”消息以将其放回队列(取决于设置)。这可能是一个bug,但是您描述的用例(只是有一个没有使用者的队列来累积消息)并不是一个真正有效的用例,所以即使它是一个bug,对工作人员来说也可能不是一个巨大的优先级

注意未确认的消息绑定到特定的通道,而不是特定的消费者(我假设,但事实上不知道,管理API通过在引擎盖下创建通道来工作)。因此,也可以通过关闭并重新启动管理插件,甚至可能是经纪人(尽管所有赌注都在那里)来重新获得这些

从中,应重新启动以下管理插件:

rabbitmqctl eval“应用程序:停止(rabbitmq_管理)。”
rabbitmqctl eval'应用程序:启动(rabbitmq_管理)。'

作为澄清-所有这些未确认的消息都是通过交付到web客户端而结束的?而且,一般来说,这不是RabbitMQ的有效用例。如果您想查看消息,请将这些消息保存到数据库中,以耗尽此队列,然后可以随意导航数据库。您好@theMayer,是的,这是正确的,我们有两个队列(称它们为q1和q1bkp)。我们向两者发送相同的消息,但q1有一个消费者接收消息并对其采取行动,而q1bkp没有消费者,因此一个人可以手动查看数据。你关于DB的观点是正确的,谢谢。我们之所以没有这个功能,是因为我们正在为客户开发一些软件,并且需要一种快速的n-dirty方法来检查我们的集成消息,而无需花费可计费的时间来安装基于DB的工具。谢谢,@theMayer!这正是我需要知道的。我将尝试按照您建议的方式删除并重新创建队列。实际上,再仔细考虑一下,关闭管理插件听起来是一个不错的选择,可以在删除队列之前尝试。我的一个保留意见是,在我们的应用程序仍在运行时,我没有尝试这样做:您知道关闭管理插件是否会影响消息的传递或使用吗?--再次感谢你的回答。这正是我想知道的。