在RabbitMQ中删除队列

103

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

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

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

16个回答

6
希望这能帮到一些人。
我尝试了上面的代码,但没有进行任何流式处理。
生成一个包含所有队列名称的文件,逐行循环删除它们: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

6

我一直在苦苦寻找一个适合手动删除rabbitmq队列的答案。因此,我认为值得在这个帖子中提到,可以使用以下命令在不使用rabbitmqadmin的情况下删除单个队列:

rabbitmqctl delete_queue <queue_name>

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>/{}

让我们分解这个命令: rabbitmqctl list_queues -p vhost_name 将列出所有队列及其当前任务数量。 grep -v "fast\|medium\|slow" 将过滤掉您不想删除的队列,比如我们想删除没有单词“快速”,“中等”或“慢”的每个队列。 tr "[:blank:]" " " 将标准化rabbitmqctl中队列名称和任务数量之间的分隔符。 cut -d " " -f 1 将通过空格拆分每行并选择第1列(队列名称)。 xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{} 将获取队列名称并将其设置为我们设置的 {} 字符,从而在过程中删除未经过滤的所有队列。
请确保所使用的用户具有管理员权限。

感谢@phriscage的启发 :) - Hassek

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的代码的迭代版本。


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 的格式命名的。


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


看起来你在包含一个指向你自己的产品或服务的链接,或者一个与你有关联的产品或服务的链接。如果是这种情况,你必须在回答中必须披露你的关联关系。 - Hoppeduppeanut
HareDu是一个100%免费的OSS项目,它解决了使用.NET语言(如C#)时的问题。 - Albert

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