删除RabbitMQ中的队列

我有几个与RabbitMQ运行的队列。 其中一些现在没用,我怎么删除它们? 不幸的是我没有设置auto_delete选项。

如果我现在设置,它会被删除?

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

如果您不关心其他队列,可以通过命令行按顺序运行以下命令来删除所有队列:

警告:这也将删除您在兔子服务器上configuration的任何用户虚拟主机

 rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app 

rabbitmq文档说reset命令:

从所属的任何集群中删除节点,从pipe理数据库中删除所有数据,例如configuration的用户和虚拟主机,并删除所有持久性消息。

所以,小心使用它。

在RabbitMQ版本> 3.0中,如果启用rabbitmq_management插件,还可以使用HTTP API。 只要确保将内容types设置为“application / json”并提供虚拟主机和队列名称:

IE使用curl与虚拟主机“testing”和队列名称“testqueue”:

 $ 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 
 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 Installer

 > easy_install pip > pip install pika==0.9.8 

rabbitmqadmin这是很好的从控制台工作。

如果您在安装有兔子的服务器上ssh /login,可以从以下位置下载:

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

并保存到/ usr / local / bin / rabbitmqadmin

那你可以跑了

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

通常它需要sudo。

如果你想避免input你的用户名和密码,你可以使用config

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

所有假设你有文件** /var/lib/rabbitmq/.rabbitmqadmin.conf**,并有最less的

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

编辑:从@ user299709评论,指出用户必须被标记为“pipe理员”在兔子可能是有帮助的。 ( https://www.rabbitmq.com/management.html

你声明一个队列存在(并创build它,如果没有)通过使用queue.declare 。 如果您最初将自动删除设置为false,则使用autodelete true再次调用queue.declare将导致软错误,代理将closures该通道。

你现在需要使用queue.delete来删除它。

有关详细信息,请参阅API文档:

  • Java客户端queueDelete
  • .NET客户端queueDelete

如果您使用另一个客户端,则需要find等效的方法。 由于它是协议的一部分,它应该在那里,它可能是通道或等同的一部分。

您可能还想看看其他文档,特别是Geting Started部分,其中涵盖了大量的常见用例。

最后,如果你有一个问题,在其他地方找不到答案,你应该尝试在RabbitMQ讨论邮件列表上张贴。 开发人员尽力回答所有问题。

使用运行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=% 

另一个select是启用management_plugin并通过浏览器连接到它。 你可以看到所有的队列和关于它们的信息。 从这个接口删除队列是可能的也是简单的。

pipe理插件(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 

我已经将Piotr Stapp的JavaScript / jQuery方法进一步概括了一下,将它封装到一个函数中,并将其推广一下。

此函数使用RabbitMQ HTTP API来查询给定vhost可用队列,然后根据可选的queuePrefix删除它们:

 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)} }); }); } }); }; 

一旦在RabbitMQpipe理页面上将此函数粘贴到浏览器的JavaScript控制台中,就可以像这样使用它:

删除'/'虚拟主机中的所有队列

 deleteQueues('/'); 

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

 deleteQueues('/', 'test'); 

删除'dev'vhost中所有以'foo'开头的队列

 deleteQueues('dev', 'foo'); 

请自行承担风险!

我在.profile使用这个别名:

 alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py" 

其中qclean.py具有以下代码:

 import sys import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() queues = sys.stdin.readlines()[1:-1] for x in queues: q = x.split()[0] print 'Deleting %s...' %(q) channel.queue_delete(queue=q) connection.close() 

实质上,这是Shweta B. Patil的代码的迭代版本。

安装rabbitmq_management插件后,您可以运行此命令来删除所有不需要的队列:

 rabbitmqctl list_queues -p vhost_name |\ grep -v "fast\|medium\|slow" |\ tr "[:blank:]" " " |\ cut -d " " -f 1 |\ xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost_name>/{} 

让我们打破命令:

rabbitmqctl list_queues -p vhost_name将列出所有队列以及当前有多less任务。

grep -v "fast\|medium\|slow"会过滤你不想删除的队列,假设我们想要删除每一个没有fastmedium或者slow的队列。

tr "[:blank:]" " "将在rabbitmqctl上的队列名称和任务数量之间规范化分隔符

cut -d " " -f 1会将每行按空格分隔并选取第一列(队列名称)

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}将选取队列名称并将其设置到我们设置{}字符的位置,删除在过程中未被过滤的所有队列。

确保用户使用了pipe理员权限。

我做了不同的方式,因为我只能访问pipe理网页。 我创build了简单的“片段”,它删除了Javascript中的队列。 这里是:

 function zeroPad(num, places) { var zero = places - num.toString().length + 1; return Array(+(zero > 0 && zero)).join("0") + num; } var queuePrefix = "PREFIX" for(var i=0; i<255; i++){ var queueid = zeroPad(i, 4); $.ajax({url: '/api/queues/vhost/'+queuePrefix+queueid, type: 'DELETE', success: function(result) {console.log('deleted '+queuePrefix+queueid)}}); } 

我所有的队列格式是:PREFIX_0001到PREFIX_0XXX

Interesting Posts