如何使用 CLI 从单个队列中删除所有消息?

Posted

技术标签:

【中文标题】如何使用 CLI 从单个队列中删除所有消息?【英文标题】:How do I delete all messages from a single queue using the CLI? 【发布时间】:2011-07-15 20:14:06 【问题描述】:

如何使用 cli 从单个队列中删除所有消息? 我有队列名称,我想清理它。

【问题讨论】:

【参考方案1】:

rabbitmqadmin 是解决此问题的完美工具

rabbitmqadmin purge queue name=name_of_the_queue_to_be_purged

【讨论】:

我很难在我的 rabbitmq 安装中找到该工具。我终于从这里下载了:hg.rabbitmq.com/rabbitmq-management/raw-file/rabbitmq_v3_3_5/… 如果你已经安装了管理插件,可以从http://rabbitserver:15672/cli/下载【参考方案2】:

重要提示:这将删除所有用户和配置。

警告!!

警告!!

除非您想从所有队列中删除数据,包括用户和配置,否则我不建议使用此答案。 只需重置它!!!

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

【讨论】:

这也会重置您的用户和其他配置! 我将其用作单元测试的一部分。例如我清除了所有内容,然后通过***.com/questions/4545660/… 以编程方式进行设置,然后填充一些消息并进行黑盒测试以确保消息通过。非常适合这个目的。 :) 真是太天真了。作为一个严肃问题的答案是不可接受的。它将销毁所有服务器数据。 将存储归零并重新安装操作系统也会删除数据;这不是 OP 所要求的【参考方案3】:

要清除队列,您可以使用以下命令(API 文档中的更多信息):

curl -i -u guest:guest -XDELETE http://localhost:15672/api/queues/vhost_name/queue_name/contents

【讨论】:

效果如何,有点吓人。有什么方法可以防止这种意外发生?例如禁用此功能以防止意外数据丢失的生产服务器配置? 是的,保护措施是使用“delete_user”命令删除用户“guest”【参考方案4】:

我已经成功地使用来自amqp-utils 的ampq-purge 来做到这一点:

git clone https://github.com/dougbarth/amqp-utils.git
cd amqp-utils
# extracted from Rakefile
echo "source 'https://rubygems.org'
gem 'amqp', '~> 0.7.1'
gem 'trollop', '~> 1.16.2'
gem 'facets', '~> 2.9'
gem 'clio', '~> 0.3.0'
gem 'json', '~> 1.5'
gem 'heredoc_unindent', '~> 1.1.2'
gem 'msgpack', '~> 0.4.5'" > Gemfile
bundle install --path=$PWD/gems
export RUBYLIB=.
export GEM_HOME=$PWD/gems/ruby/1.9.1

ruby bin/amqp-purge -v -V /vhost -u user -p queue
# paste password at prompt

【讨论】:

【参考方案5】:

我猜它晚了,但供其他人参考,这可以用 pika 完成

import pika
host_ip = #host ip
channel = pika.BlockingConnection(pika.ConnectionParameters(host_ip,
                                                        5672,
                                                        "/",
credentials=pika.PlainCredentials("username","pwd"))).channel()
print "deleting queue..", channel.queue_delete(queue=queue_name)

【讨论】:

嗨@prajnavantha 是鼠兔有任何方法清除消息吗? (不删除队列)【参考方案6】:

RabbitMQ 实现了高级消息队列协议 (AMQP),因此您可以使用通用工具来处理此类问题。

在 Debian/Ubuntu 或类似系统上,执行:

sudo apt-get install amqp-tools
amqp-delete-queue -q celery  # where celery is the name of the queue to delete

【讨论】:

对于一些没有rabbitmqadmin的版本,这是一个很好的解决方案。 这会删除整个队列,而不仅仅是清除它。所以队列不存在了,之后你必须重新初始化空队列。【参考方案7】:

你可以直接运行这个命令

sudo rabbitmqctl purge_queue queue_name

【讨论】:

或者,如果您有虚拟主机,请执行rabbitmqctl purge_queue queue_name -p my_virt_host 运行 sudo rabbitmqctl -h 并检查当前 rabbitmq 列出的 cammand 列表。如果不存在,则表示当前版本的 rabbitmq 不支持此功能。 这对我不起作用——当我的消费者启动时,队列仍然充满了任务。 这可以在 3.5.4 或 3.6.0 中实现,基于 github.com/rabbitmq/rabbitmq-server/pull/215 和 rabbitmq.com/changelog.html 。如果您有旧版本,***.com/a/18267342/272387 的 rabbitmqadmin 可能会有所帮助。 ...并签入github.com/rabbitmq/rabbitmq-server/releases/tag/…,此功能出现在3.5.4中。【参考方案8】:

RabbitMQ 在队列中有 2 个东西

    删除 清除

删除 - 将删除队列

Purge - 这将清空队列(意味着从队列中删除消息但队列仍然存在)

【讨论】:

这可能看起来很简单,但这正是我需要的答案。【参考方案9】:

为了从队列中仅删除消息,请使用:

sudo rabbitmqctl --node <nodename> purge_queue <queue_name>

为了删除一个空队列--if-empty)或没有消费者(--if-unused ) 使用:

sudo rabbitmqctl --node <nodename> delete_queue <queue_name> --if-empty

sudo rabbitmqctl --node <nodename> delete_queue <queue_name> --if-unused 

【讨论】:

【参考方案10】:

如果您将 RabbitMQ 与 Docker 一起使用,您的步骤应该是:

    连接到容器:docker exec -it your_container_id bash rabbitmqctl purge_queue Queue-1(其中 Queue-1 是队列名称)

【讨论】:

如果从 docker 容器外部清除队列,为什么会有所不同?队列不是完全不知道(或者更确切地说是什么)正在使用它吗?我不是在暗示什么,我只是在问。【参考方案11】:

我的rabbitmqclt 是没有purge_queue 的旧版本,我没有安装rabbitmqadmin

我们的应用程序在 celery 上运行,它有这个有效的命令:

celery -A <app_name> -Q <queue_name> purge

【讨论】:

以上是关于如何使用 CLI 从单个队列中删除所有消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何从RabbitMQ删除所有队列

如何清空Windows消息队列

如何使用 PowerShell 从 MSMQ 消息队列中删除特定消息

我们如何使用 jboss cli 从 jboss mq 中删除特定消息

使用azure服务总线,如何将单个消息发布到多个队列?

MassTransit 使用队列中的所有消息