我有几个使用RabbitMQ进行管理的队列。现在其中一些已经没有用处了,我该如何删除它们?不幸的是,我之前没有设置auto_delete
选项。
如果我现在设置这个选项,这些队列会自动删除吗?
有没有办法现在就删除那些队列?
sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done
。对于循环,while read ...
对我没有用,它总是停在第一个队列名处。do sudo rabbitmqctl delete_queue queue_name
。我使用的是 rabbitmqctl
而不是 rabbitmqadmin
。我一直在苦苦寻找一个适合手动删除rabbitmq队列的答案。因此,我认为值得在这个帖子中提到,可以使用以下命令在不使用rabbitmqadmin
的情况下删除单个队列:
rabbitmqctl delete_queue <queue_name>
如果已安装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>/{}
将获取队列名称并将其设置为我们设置的 {}
字符,从而在过程中删除未经过滤的所有队列。我在.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的代码的迭代版本。
我采用了不同的方法,因为我只能访问管理网页。我创建了一个简单的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 的格式命名的。
如果你使用的是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