我安装rabbitmqadmin
并能够列出所有的交换和队列。如何使用rabbitmqadmin
或rabbitmqctl
删除所有队列。
24 回答
首先,列出您的队列:
rabbitmqadmin list queues name
然后从列表中,您需要手动将它们一一删除:
rabbitmqadmin delete queue name='queuename'
由于输出格式的原因,您似乎无法从 grep 响应list queues
。或者,如果您只是在寻找一种清除所有内容的方法(阅读:重置所有设置,将安装返回到默认状态),请使用:
rabbitmqctl stop_app
rabbitmqctl reset # Be sure you really want to do this!
rabbitmqctl start_app
使用管理插件和策略实际上超级容易:
转到管理控制台(localhost:15672)
转到管理选项卡
转到策略选项卡(在右侧)
添加策略
填写字段
- 虚拟主机:选择
- 名称:过期所有策略(稍后删除)
- 图案: .*
- 适用于:队列
- 定义: 过期值为1(将类型从字符串更改为数字)
节省
再次结帐队列选项卡
必须删除所有队列
并且不要忘记删除政策!!!!!!.
您可以使用rabbitmqadmin
此单线删除它们:
rabbitmqadmin -f tsv -q list queues name | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
在 Rabbit 版本 3.7.10 中,您可以使用 root 权限运行以下命令:
rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl delete_queue
试试这个:
rabbitmqadmin list queues name | awk '{print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn
如果您没有安装 rabbitmqadmin,请尝试使用 rabbitmqctl 清除队列:
rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl purge_queue
如果您尝试删除队列,因为它们未使用并且您不想重置,一种选择是通过策略将队列 TTL 设置为非常低,等待队列在 TTL 通过后自动删除然后删除该策略 ( https://www.rabbitmq.com/ttl.html )。
rabbitmqctl.bat set_policy delq ".*" '{"expires": 1}' --apply-to queues
删除策略
rabbitmqctl clear_policy delq
请注意,这仅适用于未使用的队列
此处的原始信息:http ://rabbitmq.1065348.n5.nabble.com/Deleting-all-queues-in-rabbitmq-td30933.html
我做了一个 deleteRabbitMqQs.sh,它接受参数来搜索队列列表,只选择与你想要的模式匹配的那些。如果您不提供任何参数,它将全部删除!它向您显示即将删除的队列列表,让您在执行任何破坏性操作之前退出。
for word in "$@"
do
args=true
newQueues=$(rabbitmqctl list_queues name | grep "$word")
queues="$queues
$newQueues"
done
if [ $# -eq 0 ]; then
queues=$(rabbitmqctl list_queues name | grep -v "\.\.\.")
fi
queues=$(echo "$queues" | sed '/^[[:space:]]*$/d')
if [ "x$queues" == "x" ]; then
echo "No queues to delete, giving up."
exit 0
fi
read -p "Deleting the following queues:
${queues}
[CTRL+C quit | ENTER proceed]
"
while read -r line; do
rabbitmqadmin delete queue name="$line"
done <<< "$queues"
如果您想要对传入的参数进行不同的匹配,您可以更改第四行中的 grep。删除所有队列时,它不会删除其中包含三个连续空格的队列,因为我认为这种可能性比使用 rabbitmqctl 以不同语言打印输出的人更罕见。
享受!
这是使用 PowerShell 的一种方法。URL 可能需要更新
$cred = Get-Credential
iwr -ContentType 'application/json' -Method Get -Credential $cred 'http://localhost:15672/api/queues' | % {
ConvertFrom-Json $_.Content } | % { $_ } | ? { $_.messages -gt 0} | % {
iwr -method DELETE -Credential $cred -uri $("http://localhost:15672/api/queues/{0}/{1}" -f [System.Web.HttpUtility]::UrlEncode($_.vhost), $_.name)
}
您可以使用 rabbitmqctl eval 如下:
rabbitmqctl eval 'IfUnused = false, IfEmpty = true, MatchRegex =
<<"^prefix-">>, [rabbit_amqqueue:delete(Q, IfUnused, IfEmpty) || Q <-
rabbit_amqqueue:list(), re:run(element(4, element(2, Q)), MatchRegex)
=/= nomatch ].'
以上将删除名称以“prefix-”开头的所有虚拟主机中的所有空队列。您可以根据需要编辑变量 IfUnused、IfEmpty 和 MatchRegex。
使用rabbitmqctl one liner删除所有队列
rabbitmqctl list_queues | awk '{ print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue
您无需重置 rabbitmq 服务器即可删除非持久队列。只需停止服务器并重新启动,它将删除所有可用的非持久队列。
如果您只想清除非空队列(更快):
rabbitmqctl list_queues | awk '$2!=0 { print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue
对我来说,清除一个队列(空的和非空的)需要 2-3 秒,所以迭代 50 个队列是一件很痛苦的事情,而我只需要清除其中的 10 个(40/50 是空的)。
我尝试了 rabbitmqctl 和 reset 命令,但它们非常慢。
这是我找到的最快的方法(替换您的用户名和密码):
#!/bin/bash
# Stop on error
set -eo pipefail
USER='guest'
PASSWORD='guest'
curl -sSL -u $USER:$PASSWORD http://localhost:15672/api/queues/%2f/ | jq '.[].name' | sed 's/"//g' | xargs -L 1 -I@ curl -XDELETE -sSL -u $USER:$PASSWORD http://localhost:15672/api/queues/%2f/@
# To also delete exchanges uncomment next line
# curl -sSL -u $USER:$PASSWORD http://localhost:15672/api/exchanges/%2f/ | jq '.[].name' | sed 's/"//g' | xargs -L 1 -I@ curl -XDELETE -sSL -u $USER:$PASSWORD http://localhost:15672/api/exchanges/%2f/@
注意:这仅适用于默认虚拟主机 /
这是一个更快的版本(使用parallel
install sudo apt-get install parallel)扩展了 @admenva 的出色答案
parallel -j 50 rabbitmqadmin -H YOUR_HOST_OR_LOCALHOST -q delete queue name={} ::: $(rabbitmqadmin -H YOUR_HOST_OR_LOCALHOST -f tsv -q list queues name)
此命令删除所有队列
python rabbitmqadmin.py \
-H YOURHOST -u guest -p guest -f bash list queues | \
xargs -n1 | \
xargs -I{} \
python rabbitmqadmin.py -H YOURHOST -u guest -p guest delete queue name={}
这个脚本非常简单,因为它使用-f bash
,将队列输出为列表。
然后我们用xargs -n1
它把它分成多个变量
然后我们使用xargs -I{}
它将运行以下命令,并{}
在命令中替换。
要列出队列,
./rabbitmqadmin -f tsv -q list queues
要删除队列,
./rabbitmqadmin delete queue name=name_of_queue
我尝试了上面的代码,但我没有做任何流式传输。
sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done
.
我生成一个包含所有队列名称的文件,并逐行循环以删除它们。对于循环,while read ...
没有为我做。它总是停在第一个队列名称处。
对于安装rabbitmqadmin有问题的人,你应该先安装python。
类 UNIX 操作系统用户需要将 rabbitmqadmin 复制到 PATH 中的一个目录,例如 /usr/local/bin。
Windows 用户需要确保 Python 在他们的 PATH 上,并以 python.exe rabbitmqadmin 的形式调用 rabbitmqadmin。
然后
- 浏览
http://{hostname}:15672/cli/rabbitmqadmin
至下载。 - 转到包含的文件夹,然后以管理员权限运行 cmd
列出队列
python rabbitmqadmin list queues
。
删除队列
python rabbitmqadmin delete queue name=Name_of_queue
删除所有队列
1- 声明政策
python rabbitmqadmin declare policy name='expire_all_policies' pattern=.* definition={\"expires\":1} apply-to=queues
2- 删除政策
python rabbitmqadmin delete policy name='expire_all_policies'
有一种方法可以在没有脚本和完全重置的情况下删除所有队列和交换。您可以从管理界面删除并重新创建虚拟主机。这甚至适用于 vhost /
。
您唯一需要恢复的是新创建的虚拟主机的权限。
好的,这个答案的重要限定符:这个问题确实要求使用rabbitmqctl或rabbitmqadmin来解决这个问题,我的答案需要同时使用两者。另外,请注意,这是在 MacOS 10.12.6 以及在使用 Homebrew 安装 rabbitmq 时安装的rabbitmqctl和rabbitmqadminbrew list --versions
版本进行测试的,并且标识为rabbitmq 3.7.0
rabbitmqctl list_queues -p <VIRTUAL_HOSTNAME> name | sed 1,2d | xargs -I qname rabbitmqadmin --vhost <VIRTUAL_HOSTNAME> delete queue name=qname
另一种选择是删除与队列关联的虚拟主机。这将删除与虚拟主机关联的所有内容,因此请注意,但它既简单又快速。
注意: RabbitMQ 团队会监控邮件列表,rabbitmq-users
有时只会在 StackOverflow 上回答问题。
这是我使用的一种方法。它简单、清晰、有效。这是文件:
Vhost=the_vhost_name
User=user_name
Password=the_passworld
for i in `rabbitmqctl list_queues -p $Vhost | awk '{ print $1 }'`
do
echo "queu_name: $i"
curl -u $User:$Passworld -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/$Vhost/$i
done
rabbitmqadmin list queues|awk 'NR>3{print $4}'|head -n-1|xargs -I qname rabbitmqadmin delete queue name=qname