在RabbitMQ中删除队列


93

我有几个使用RabbitMQ运行的队列。它们中的一些现在已无用,如何删除它们?不幸的是我没有设置auto_delete选项。

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

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

Answers:


121

如果您不关心管理数据库中的数据;即usersvhostsmessages等等,既不对等queues,那么你可以reset通过在顺序运行以下命令命令行:

警告:除了队列,这还将删除您在RabbitMQ服务器上配置的所有usersvhosts;并将删除所有持久性messages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

RabbitMQ的文件说,该reset命令:

将RabbitMQ节点返回其原始状态。

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

因此,请小心使用它。


46
警告:这还将删除您在Rabbit服务器上配置的所有用户和虚拟主机。我发现这很困难:)
母权时代

糟糕,对此感到抱歉。我还没有注意到它,因为我在使用Rabbitmq时具有非常基本的配置。我将更新答案。谢谢!
法鲁克·沙欣

3
这是一个非常极端的答案。您还可以说“关闭服务器并擦拭磁盘”以“删除”队列。
RubyTuesdayDONO

30
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,请运行MS Windows Installer for setuptools

> easy_install pip
> pip install pika==0.9.8

非常感谢已经使用pika的人们,非常感谢
m.raynal

27

在RabbitMQ版本> 3.0中,如果启用了Rabbitmq_management插件,则还可以使用HTTP API。只需确保将content-type设置为'application / json'并提供虚拟主机和队列名称:

IE将curl与虚拟主机“ test”和队列名称“ 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

1
确保标记了您的用户,administrator否则他们将无法使用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 2014年

23

rabbitmqadmin,可以从控制台很好地工作。

如果您ssh /登录到已安装Rabbit的服务器,则可以从以下位置下载:

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

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

那你就可以跑

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

通常它需要sudo。

如果要避免输入用户名和密码,可以使用config

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 2015年

检查身份验证日志,兔子日志...用户可能没有在VHost上工作的权限...很难说从哪里开始
Lukino 2015年

解决方案是使用“ administrator”标签设置用户
user299709 2015年

16

简短摘要,其中列出了正在运行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文档:

如果您使用其他客户端,则需要找到等效的方法。由于它是协议的一部分,因此应该存在,并且可能是Channel或等效版本的一部分。

您可能还希望查看文档的其余部分,特别是涵盖许多常见用例的“ 入门”部分。

最后,如果您有问题但在其他地方找不到答案,则应尝试在RabbitMQ Discuss邮件列表中发布。开发人员会尽力回答那里提出的所有问题。


10

另一个选择是启用management_plugin并通过浏览器连接到它。您可以查看所有队列以及有关它们的信息。从此接口删除队列是可能且简单的。


我已经完成了此操作,但是我的management_plugin处于与命令行界面不同的状态
Sweet Chilly Philly 2016年

9

我进一步概括了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)}
                });
            });
        }
    });
};

在RabbitMQ管理页面上将此功能粘贴到浏览器的JavaScript控制台中后,您可以按以下方式使用它:

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

deleteQueues('/');

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

deleteQueues('/', 'test');

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

deleteQueues('dev', 'foo');

请自行承担风险!


1
仅使用Web管理员,这对于删除大量具有相同前缀的队列非常有用。谢谢!
espenoh '16

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

5

我在中使用此别名.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的代码的迭代版本。



5

希望它可以帮助某人。

我尝试了以上代码,但未进行任何流式传输。

sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done

我生成了一个包含所有队列名称的文件,并逐行循环删除它们。对于循环,while read ...没有为我做。它总是在第一个队列名称处停止。

另外,如果您要删除单个队列,上述解决方案将对(python,Java ...)和也有帮助do sudo rabbitmqctl delete_queue queue_name。我使用rabbitmqctl而不是rabbitmqadmin


4

安装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 将列出所有队列以及它们当前有多少个任务。

grep -v "fast\|medium\|slow"将过滤您不想删除的队列,假设我们要删除每个队列,而没有单词fastmediumslow

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>/{}将选择队列名称并将其设置为我们设置{}字符的位置,以删除该过程中未过滤的所有队列。

确保使用过的用户具有管理员权限。


由于@phriscage为灵感:)
Hassek

2

我这样做的方式有所不同,因为我只能访问管理网页。我创建了简单的“片段”,该片段删除了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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.