在RabbitMQ中删除队列

103

我有几个使用RabbitMQ进行管理的队列。现在其中一些已经没有用处了,我该如何删除它们?不幸的是,我之前没有设置auto_delete选项。

如果我现在设置这个选项,这些队列会自动删除吗?

有没有办法现在就删除那些队列?

16个回答

128

如果你不关心管理数据库中的数据,例如 usersvhostsmessages等,也不关心其他的 queues,那么你可以通过命令行来 reset,按照以下顺序运行以下命令:

警告:除了队列之外,这也将删除你在 RabbitMQ 服务器上配置的任何 usersvhosts 并且将删除任何持久性的messages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

根据RabbitMQ文档reset命令的含义为:

将RabbitMQ节点还原到其初始状态。

将节点从其所属的集群中移除,删除所有管理数据库中的数据,例如配置的用户和虚拟主机,并删除所有持久化消息。

因此,在使用时要小心。


52
警告:这也将删除您在 Rabbit 服务器上配置的任何用户和虚拟主机。我是吃过亏才知道的 :) - mafrosis
抱歉,我没有注意到这个问题,因为当时我使用的是非常基本的配置。我会更新答案。谢谢! - Faruk Sahin
6
这是一个极端的回答。您也可以说“关闭服务器并擦除磁盘”来“删除”队列。 - RubyTuesdayDONO

37
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
               'localhost'))
channel = connection.channel()

channel.queue_delete(queue='queue-name')

connection.close()

按照以下方式安装pika包:

$ sudo pip install pika==0.9.8
安装取决于pip和git-core软件包,您可能需要先安装它们。
在Ubuntu上:
$ sudo apt-get install python-pip git-core

在 Debian 上:

$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip

在Windows系统中:要安装 easy_install,请运行setuptools的MS Windows安装程序

> easy_install pip
> pip install pika==0.9.8

对于那些已经使用 Pika 的人来说肯定更容易,非常感谢。 - m.raynal

31
在 RabbitMQ 版本 > 3.0 中,如果启用了 rabbitmq_management 插件,您还可以使用 HTTP API。只需确保将内容类型设置为 'application/json' 并提供 vhost 和队列名称:
例如,使用 vhost 为 'test' 和队列名称为 'testqueue' 的 curl 命令:
$ curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/test/testqueue
HTTP/1.1 204 No Content
Server: MochiWeb/1.1 WebMachine/1.9.0 (someone had painted it blue)
Date: Tue, 16 Apr 2013 10:37:48 GMT
Content-Type: application/json
Content-Length: 0

1
确保您的用户被标记为“管理员”,否则他们将无法使用API的某些部分。 - ubershmekel
1
我得到了:$ curl -i -u 'user:pass' -H "content-type:application/json" -XDELETE 'http://localhost:15672/api/queues/vhostname/name.portal' HTTP/1.1 204 No Content Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact) Date: Wed, 30 Jul 2014 11:23:47 GMT Content-Type: application/json Content-Length: 0但是队列仍然存在 :( - 有什么想法吗? - Hackeron

27

有一个名为rabbitmqadmin的工具,可以在控制台上很好地使用。

如果您通过ssh或日志登录安装了rabbit的服务器,您可以从以下位置下载它:

http://{server}:15672/cli/rabbitmqadmin

将其保存到/usr/local/bin/rabbitmqadmin

然后你可以运行

rabbitmqadmin -u {user} -p {password} -V {vhost} delete queue name={name}

通常需要使用sudo。

如果您想避免输入用户名和密码,可以使用配置文件。

rabbitmqadmin -c /var/lib/rabbitmq/.rabbitmqadmin.conf -V {vhost} delete queue name={name}

以上假设您拥有文件 **/var/lib/rabbitmq/.rabbitmqadmin.conf** 并且具备最基本的要求。

hostname = localhost
port = 15672
username = {user}
password = {password}

编辑:根据@user299709的评论,指出在rabbit中,用户必须被标记为“管理员”。 (https://www.rabbitmq.com/management.html)


这对我返回了无法连接:[Errno 111]连接被拒绝,有没有什么办法可以调试以查看发生了什么? - user299709
检查认证日志、Rabbit日志... 用户可能没有针对VHost的权限... 很难说从哪里开始。 - Lukino
解决方案是将用户设置为“管理员”标签。 - user299709

17
从运行RMQ服务器的主机中快速删除所有默认值的队列的简短摘要:
curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName

要删除给定虚拟主机中与模式匹配的所有队列(例如,在根虚拟主机中包含“amq.gen”):

rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%

15
使用queue.declare断言队列存在(如果不存在则创建它)。如果最初将auto-delete设置为false,并调用带有autodelete true的queue.declare,这将导致软错误,经纪人将关闭通道。
现在需要使用queue.delete来删除它。
有关详细信息,请参阅API文档: 如果您使用其他客户端,则需要找到相应的方法。由于它是协议的一部分,因此应该存在,并且可能是通道或等效通道的一部分。
您可能还想查看其余文档,尤其是涵盖许多常见用例的入门部分。
最后,如果您有问题并且无法在其他地方找到答案,您可以尝试发布到RabbitMQ Discuss邮件列表。开发人员尽最大努力回答那里提出的所有问题。

11

另一种选择是启用management_plugin并在浏览器上连接它。您可以查看所有队列及其相关信息。在此界面上删除队列既可简单又方便。


我已经完成了这个任务,但是我的管理插件与命令行界面的状态不同。 - Sweet Chilly Philly

9
我对Piotr Stapp的JavaScript/jQuery方法进行了一些泛化,将其封装成一个函数并进一步泛化。
这个函数使用RabbitMQ HTTP API来查询给定中可用的队列,然后根据可选的删除它们:
function deleteQueues(vhost, queuePrefix) {
    if (vhost === '/') vhost = '%2F';  // html encode forward slashes
    $.ajax({
        url: '/api/queues/'+vhost, 
        success: function(result) {
            $.each(result, function(i, queue) {
                if (queuePrefix && !queue.name.startsWith(queuePrefix)) return true;
                $.ajax({
                    url: '/api/queues/'+vhost+'/'+queue.name, 
                    type: 'DELETE', 
                    success: function(result) { console.log('deleted '+ queue.name)}
                });
            });
        }
    });
};

在 RabbitMQ 管理页面上,将以下函数粘贴到您的浏览器 JavaScript 控制台中,即可按如下方式使用:

删除 '/' vhost 中的所有队列

deleteQueues('/');

删除以“test”开头的“/”虚拟主机中的所有队列

deleteQueues('/', 'test');

删除以“foo”开头的“dev”虚拟主机中的所有队列

deleteQueues('dev', 'foo');

请自行承担使用此内容的风险!


1
这个方法非常完美地解决了使用Web管理工具删除大量具有相同前缀的队列的问题。谢谢! - espenoh

7
安装
$ sudo rabbitmq-plugins enable rabbitmq_management

如果您使用的是localhost,请前往http://localhost:15672/#/queues。默认密码是username: guestpassword: guest。然后进入队列选项卡并删除队列。


谢谢你,非常感谢。我发现你的回答非常有帮助。 - bereket gebredingle

6
管理插件(Web界面)提供了一个指向Python脚本的链接,您可以使用它来删除队列。我使用了这种模式来删除很多队列:
python tmp/rabbitmqadmin --vhost=... --username=... --password=... list queues > tmp/q

vi tmp/q # remove all queues which you want to keep

cut -d' ' -f4 tmp/q| while read q; 
    do python tmp/rabbitmqadmin --vhost=... --username=... --password=... delete queue name=$q; 
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接