如何使用 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 从单个队列中删除所有消息?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PowerShell 从 MSMQ 消息队列中删除特定消息