删除RabbitMQ中的队列

时间:2011-07-19 06:07:28

标签: queue rabbitmq

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

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

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

16 个答案:

答案 0 :(得分:113)

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

警告:这也将删除您在Rabbit服务器上配置的用户 vhosts

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

rabbitmq文档说reset命令:

  

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

所以,小心使用它。

答案 1 :(得分:27)

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

答案 2 :(得分:25)

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

即。将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

答案 3 :(得分:21)

rabbitmqadmin 非常适合在控制台上工作。

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

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的评论,指出用户必须被标记为' administrator'在兔子里(https://www.rabbitmq.com/management.html

答案 4 :(得分:14)

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

您现在需要使用 queue.delete 才能将其删除。

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

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

您可能还想查看其余文档,特别是Geting Started部分,其中涵盖了许多常见用例。

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

答案 5 :(得分:14)

快速队列删除的简短摘要,其中包含运行RMQ服务器的主机的所有默认值:

curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName

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

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

答案 6 :(得分:10)

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

答案 7 :(得分: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('/');

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

开头
deleteQueues('/', 'test');

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

开头
deleteQueues('dev', 'foo');

请自行承担使用此风险!

答案 8 :(得分: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

答案 9 :(得分: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的代码的迭代版本。

答案 10 :(得分: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"将过滤您不想删除的队列,假设我们要删除每个队列而不使用 fast medium 或< EM>慢

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

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

答案 11 :(得分:4)

安装

$ sudo rabbitmq-plugins enable rabbitmq_management

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

答案 12 :(得分:2)

我的方式不同,因为我只能访问管理网页。我创建了简单的&#34;片段&#34;在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

答案 13 :(得分:1)

希望它可以对某人有所帮助。

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

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

答案 14 :(得分:1)

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

rabbitmqctl delete_queue <queue_name>

答案 15 :(得分:0)

如果你使用 C#,你可以像这样使用 HareDu API:

var result = await _services.GetService<IBrokerObjectFactory>()
    .DeleteQueue("queue", "vhost");

...或

var result = await _services.GetService<IBrokerObjectFactory>()
    .DeleteQueue("queue", "vhost", x =>
    {
        x.WhenHasNoConsumers();
        x.WhenEmpty();
    });

https://github.com/ahives/HareDu2/blob/master/docs/queue-delete.md