删除RabbitMQ中的队列

Pha*_*gun 85 queue rabbitmq

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

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

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

Far*_*hin 114

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

警告:这也将删除您在Rabbit服务器上配置的所有用户虚拟主机

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
Run Code Online (Sandbox Code Playgroud)

rabbitmq文档说该reset命令:

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

所以,小心使用它.

  • 警告:这也将删除您在Rabbit服务器上配置的所有用户和虚拟主机.我发现这很困难 :) (43认同)
  • 这不应该是公认的答案. (5认同)
  • 这是一个非常极端的答案.你也可以说"关闭服务器并擦除磁盘"以"删除"队列. (2认同)

Shw*_*til 27

import pika

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

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

connection.close()
Run Code Online (Sandbox Code Playgroud)

安装pika包如下

$ sudo pip install pika==0.9.8
Run Code Online (Sandbox Code Playgroud)

安装依赖于pip和git-core软件包,您可能需要先安装它们.

在Ubuntu上:

$ sudo apt-get install python-pip git-core
Run Code Online (Sandbox Code Playgroud)

关于Debian:

$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip
Run Code Online (Sandbox Code Playgroud)

在Windows上:要安装easy_install,请运行用于setuptools的MS Windows Installer

> easy_install pip
> pip install pika==0.9.8
Run Code Online (Sandbox Code Playgroud)


小智 26

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

IE使用curl与vhost'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
Run Code Online (Sandbox Code Playgroud)


Luk*_*ino 21

rabbitmqadmin,很高兴从控制台工作.

如果您ssh /登录到安装了兔子的服务器,可以从以下位置下载:

http://{server}:15672/cli/rabbitmqadmin
Run Code Online (Sandbox Code Playgroud)

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

然后你就可以跑了

rabbitmqadmin -u {user} -p {password} -V {vhost} delete queue name={name}
Run Code Online (Sandbox Code Playgroud)

通常它需要sudo.

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

rabbitmqadmin -c /var/lib/rabbitmq/.rabbitmqadmin.conf -V {vhost} delete queue name={name}
Run Code Online (Sandbox Code Playgroud)

所有这一切都假设您有文件**/var/lib/rabbitmq/.rabbitmqadmin.conf**并且没有最低限度

hostname = localhost
port = 15672
username = {user}
password = {password}
Run Code Online (Sandbox Code Playgroud)

编辑:从@ user299709发表评论,指出用户必须在兔子中被标记为"管理员"可能会有所帮助.(https://www.rabbitmq.com/management.html)


scv*_*lex 14

通过使用queue.declare断言存在队列(如果不存在则创建它).如果您最初将auto-delete设置为false,则使用autodelete true再次调用queue.declare将导致软错误,并且代理将关闭该通道.

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

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

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

您可能还想查看其余文档,特别是" 入门"部分,其中介绍了许多常见用例.

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


Ser*_*kov 14

使用运行RMQ服务器的主机的所有默认值快速删除队列的简短摘要:

curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName
Run Code Online (Sandbox Code Playgroud)

要删除与给定vhost中的模式匹配的所有队列(例如,在根vhost中包含'amq.gen'):

rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%
Run Code Online (Sandbox Code Playgroud)


rob*_*olf 10

另一种选择是启用management_plugin并通过浏览器连接到它.您可以查看所有队列和有关它们的信息.从此界面删除队列是可能的,也很简单.


Jos*_*osh 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)}
                });
            });
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

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

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

deleteQueues('/');
Run Code Online (Sandbox Code Playgroud)

删除以'test'开头的'/'vhost中的所有队列

deleteQueues('/', 'test');
Run Code Online (Sandbox Code Playgroud)

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

deleteQueues('dev', 'foo');
Run Code Online (Sandbox Code Playgroud)

请使用此风险,风险自负!


zab*_*usa 7

安装

$ sudo rabbitmq-plugins enable rabbitmq_management
Run Code Online (Sandbox Code Playgroud)

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


gue*_*tli 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
Run Code Online (Sandbox Code Playgroud)


Val*_*sen 6

我正在努力寻找适合我手动删除 rabbigmq 队列需求的答案。因此,我认为在这个线程中值得一提的是,可以在不rabbitmqadmin使用以下命令的情况下删除单个队列:

rabbitmqctl delete_queue <queue_name>
Run Code Online (Sandbox Code Playgroud)


Vla*_*mir 5

我用这个别名.profile:

alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py"
Run Code Online (Sandbox Code Playgroud)

哪里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()
Run Code Online (Sandbox Code Playgroud)

从本质上讲,这是Shweta B. Patil代码的迭代版本.


Has*_*sek 5

安装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>/{}
Run Code Online (Sandbox Code Playgroud)

让我们分解一下命令:

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

grep -v "fast\|medium\|slow"将过滤您不想删除的队列,假设我们要删除每个不带“ fast ”、“ medium ”或“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>/{}将拾取队列名称并将其设置到我们设置字符的位置,{}删除在此过程中未过滤的所有队列。

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


Jul*_*bal 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.