【发布时间】:2011-10-08 05:56:32
【问题描述】:
我有几个使用 RabbitMQ 运行的队列。现在有几个没用了,怎么删除呢?不幸的是,我没有设置auto_delete 选项。
如果我现在设置,会被删除吗?
现在有办法删除这些队列吗?
【问题讨论】:
我有几个使用 RabbitMQ 运行的队列。现在有几个没用了,怎么删除呢?不幸的是,我没有设置auto_delete 选项。
如果我现在设置,会被删除吗?
现在有办法删除这些队列吗?
【问题讨论】:
如果您不关心管理数据库中的数据;即users、vhosts、messages等,而不是其他queues,那么您可以通过命令行按顺序运行以下命令来reset:
警告:除了队列之外,这还将删除任何
users和vhosts>,你已经在你的 RabbitMQ 服务器上进行了配置;并将删除任何持久的messages
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmq documentation 表示reset 命令:
将 RabbitMQ 节点返回到其原始状态。
从它所属的任何集群中删除节点,从其中删除所有数据 管理数据库,例如配置的用户和虚拟主机,以及 删除所有持久消息。
所以,小心使用它。
【讨论】:
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
【讨论】:
在 RabbitMQ 版本 > 3.0 中,如果启用了 rabbitmq_management 插件,您还可以使用 HTTP API。只需确保将内容类型设置为“应用程序/json”并提供虚拟主机和队列名称:
I.E.将 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
【讨论】:
administrator,否则他们无法使用 API 的某些部分。
$ 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 但是队列仍然存在 :( - 有什么想法吗?
有 rabbitmqadmin 非常适合从控制台工作。
如果你 ssh/log 到你安装了 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)
【讨论】:
使用运行 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=%
【讨论】:
您使用 queue.declare 断言队列存在(如果不存在则创建它)。如果您最初将 auto-delete 设置为 false,则在 autodelete true 的情况下再次调用 queue.declare 将导致软错误,并且 broker 将关闭通道。
您现在需要使用 queue.delete 来删除它。
详情请参阅 API 文档:
如果您使用其他客户端,则需要找到等效的方法。因为它是协议的一部分,所以它应该在那里,而且它可能是 Channel 或等效的一部分。
您可能还想查看文档的其余部分,尤其是涵盖许多常见用例的 Geting Started 部分。
最后,如果您有问题并且在其他地方找不到答案,您应该尝试在RabbitMQ Discuss 邮件列表上发帖。开发人员尽最大努力回答那里提出的所有问题。
【讨论】:
另一个选项是启用 management_plugin 并通过浏览器连接到它。您可以查看所有队列和有关它们的信息。从这个界面删除队列是可能的并且很简单。
【讨论】:
我进一步概括了 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');
删除“dev”虚拟主机中以“foo”开头的所有队列
deleteQueues('dev', 'foo');
请自行承担风险!
【讨论】:
安装
$ sudo rabbitmq-plugins enable rabbitmq_management
如果您使用的是 localhost,请转到 http://localhost:15672/#/queues。默认密码为username: guest、password: guest
并转到队列选项卡并删除队列。
【讨论】:
管理插件(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
【讨论】:
我在.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 代码的迭代版本。
【讨论】:
安装 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 或 字样的每个队列慢。
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>/{} 将获取队列名称并将其设置到我们设置{} 字符的位置,删除所有未过滤的队列。
确保使用的用户具有管理员权限。
【讨论】:
希望它可以帮助某人。
我尝试了上述代码,但没有进行任何流式传输。
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。
【讨论】:
我的做法不同,因为我只能访问管理网页。我创建了简单的“sn-p”,它在 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
【讨论】:
我一直在努力寻找适合我在 rabbigmq 中手动删除队列的需要的答案。因此,我认为在这个线程中值得一提的是,可以使用以下命令在没有rabbitmqadmin 的情况下删除单个队列:
rabbitmqctl delete_queue <queue_name>
【讨论】:
如果你使用 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
【讨论】: