209

我安装rabbitmqadmin并能够列出所有的交换和队列。如何使用rabbitmqadminrabbitmqctl删除所有队列。

4

24 回答 24

302

首先,列出您的队列:

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
于 2012-07-12T20:19:39.183 回答
97

使用管理插件和策略实际上超级容易:

  • 转到管理控制台(localhost:15672)

  • 转到管理选项卡

  • 转到策略选项卡(在右侧)

  • 添加策略

  • 填写字段

    • 虚拟主机:选择
    • 名称:过期所有策略(稍后删除)
    • 图案: .*
    • 适用于:队列
    • 定义: 过期值为1(将类型从字符串更改为数字)
  • 节省

  • 再次结帐队列选项卡

  • 必须删除所有队列

  • 并且不要忘记删除政策!!!!!!.

于 2018-08-24T10:07:26.307 回答
60

您可以使用rabbitmqadmin此单线删除它们:

rabbitmqadmin -f tsv -q list queues name | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
于 2014-10-02T22:29:08.013 回答
22

在 Rabbit 版本 3.7.10 中,您可以使用 root 权限运行以下命令:

rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl delete_queue
于 2019-02-04T16:11:44.453 回答
20

试试这个:

 rabbitmqadmin list queues name | awk '{print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn
于 2015-02-18T10:12:58.397 回答
13

如果您没有安装 rabbitmqadmin,请尝试使用 rabbitmqctl 清除队列:

rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl purge_queue

于 2017-03-27T11:46:32.733 回答
9

如果您尝试删除队列,因为它们未使用并且您不想重置,一种选择是通过策略将队列 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

于 2016-04-12T13:52:40.063 回答
6

我做了一个 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 以不同语言打印输出的人更罕见。

享受!

于 2013-09-13T12:06:34.287 回答
6

这是使用 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)
 }
于 2014-11-20T02:23:36.273 回答
4

您可以使用 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。

于 2016-08-19T10:59:18.960 回答
3

使用rabbitmqctl one liner删除所有队列

rabbitmqctl list_queues | awk '{ print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue
于 2018-01-31T05:00:57.750 回答
2

您无需重置 rabbitmq 服务器即可删除非持久队列。只需停止服务器并重新启动,它将删除所有可用的非持久队列。

于 2015-10-29T09:23:37.410 回答
2

如果您只想清除非空队列(更快):

rabbitmqctl list_queues | awk '$2!=0 { print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue

对我来说,清除一个队列(空的和非空的)需要 2-3 秒,所以迭代 50 个队列是一件很痛苦的事情,而我只需要清除其中的 10 个(40/50 是空的)。

于 2018-03-30T15:21:40.410 回答
2

我尝试了 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/@

注意:这仅适用于默认虚拟主机 /

于 2018-04-25T14:50:44.037 回答
1

这是一个更快的版本(使用parallelinstall 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)

于 2015-03-15T15:45:00.493 回答
1

此命令删除所有队列

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{}它将运行以下命令,并{}在命令中替换。

于 2015-09-18T09:26:47.127 回答
1

要列出队列,

./rabbitmqadmin -f tsv -q list queues

要删除队列,

./rabbitmqadmin delete queue name=name_of_queue
于 2018-11-19T16:41:53.693 回答
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 ...没有为我做。它总是停在第一个队列名称处。

于 2019-04-23T14:21:16.043 回答
1

对于安装rabbitmqadmin有问题的人,你应该先安装python。

类 UNIX 操作系统用户需要将 rabbitmqadmin 复制到 PATH 中的一个目录,例如 /usr/local/bin。

Windows 用户需要确保 Python 在他们的 PATH 上,并以 python.exe rabbitmqadmin 的形式调用 rabbitmqadmin。

然后

  1. 浏览http://{hostname}:15672/cli/rabbitmqadmin至下载。
  2. 转到包含的文件夹,然后以管理员权限运行 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'
于 2019-11-14T07:47:24.083 回答
0

有一种方法可以在没有脚本和完全重置的情况下删除所有队列和交换。您可以从管理界面删除并重新创建虚拟主机。这甚至适用于 vhost /

您唯一需要恢复的是新创建的虚拟主机的权限。

于 2015-11-11T09:47:53.950 回答
0

好的,这个答案的重要限定符:这个问题确实要求使用rabbitmqctlrabbitmqadmin来解决这个问题,我的答案需要同时使用两者。另外,请注意,这是在 MacOS 10.12.6 以及在使用 Homebrew 安装 rabbitmq 时安装的rabbitmqctlrabbitmqadminbrew 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

于 2018-01-12T18:40:53.863 回答
0

另一种选择是删除与队列关联的虚拟主机。这将删除与虚拟主机关联的所有内容,因此请注意,但它既简单又快速。


注意: RabbitMQ 团队会监控邮件列表rabbitmq-users有时只会在 StackOverflow 上回答问题。

于 2018-12-22T16:22:09.777 回答
0

这是我使用的一种方法。它简单、清晰、有效。这是文件

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 
于 2022-01-17T08:20:53.090 回答
-1
rabbitmqadmin list queues|awk 'NR>3{print $4}'|head -n-1|xargs -I qname rabbitmqadmin delete queue name=qname
于 2014-02-20T11:22:09.950 回答