从RabbitMQ中删除所有队列?

225

我安装了 rabbitmqadmin 工具,并成功列出了所有的交换机和队列。请问,我该如何使用 rabbitmqadmin 或者 rabbitmqctl 删除所有的队列。

27个回答

322

首先,列出您的队列:

rabbitmqadmin list queues name

然后从列表中,您需要手动逐个删除它们:

rabbitmqadmin delete queue name='queuename'

由于输出格式,似乎无法从 list queues 的响应中使用 grep 进行搜索。或者,如果您只是想要清除所有设置(即:将安装程序返回到默认状态),请使用:

rabbitmqctl stop_app
rabbitmqctl reset    # Be sure you really want to do this!
rabbitmqctl start_app

5
查看RabbitMQ中的所有待处理任务:rabbitmqctl list_queues name messages messages_ready messages_unacknowledged - Guillaume Vincent
2
请注意,“rabbitmqctl reset”将把所有东西都重置回“出厂设置”。您创建的任何RabbitMQ用户、虚拟主机等都会被清除。 - thoufek
28
这段代码的意思是:仅删除所有空队列。具体实现方式是通过运行rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn命令来完成,该命令会列出所有队列并查找队列大小为零的队列,然后使用rabbitmqadmin delete queue命令来删除这些空队列。 - au_stan
4
那将删除所有名称或计数中带有 "0" 的队列。可能需要使用 grep $'\t0' 或类似方法。 - woot
rabbitmqctl的“reset”版本是否应该与通过Homebrew安装的rabbitmq兼容?对我来说似乎没有起作用。最终我使用了其中的一行答案。 - Mark Edington
显示剩余5条评论

147

使用管理插件和策略非常简单:

  • 进入管理控制台(localhost:15672)

  • 点击管理员选项卡

  • 点击右侧的策略选项卡

  • 添加策略

  • 填写字段

    • 虚拟主机:选择
    • 名称:过期所有策略(稍后删除)
    • 模式:.*
    • 应用到:队列
    • 定义: expires 值为 1 (将类型从字符串更改为数字)
  • 保存

  • 再次查看队列选项卡

  • 所有队列都必须被删除

  • 不要忘记删除策略!


3
在定义中选择“Number”,不能使用默认的“String”。 - Mathias
非常好的答案,实际上让我一整天都很开心。如果您从列表中选择“交换和队列”,您可以轻松删除队列和交换。我希望这个答案能被采纳。 - Wiktor Zychla
非常干净的解决方案,无需玩弄实例SSH。 - acidburn23
@MesutA。非常感谢。我认为在这篇文章中加入这个链接是很好的。将其添加到答案中可能会更好,因为评论可能会被清除。但是现在我至少有了这个信息。 - gelonida
2
我怎样才能一次性删除所有的交易? - kuldeep
显示剩余4条评论

66

使用rabbitmqadmin您可以使用以下单行命令将它们删除:

rabbitmqadmin -f tsv -q list queues name | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done

1
在我的情况下,队列是以关键字为前缀的,因此我可以简单地使用 egrep,所以我的命令看起来像这样:rabbitmqadmin -f tsv -q list queues name | egrep "%search word%" | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done - Logans
3
你可能需要使用-H指定主机,-u和-p参数指定凭据以连接服务器。 - Sudhanshu Mishra

31
在Rabbit 3.7.10版本中,您可以使用root权限运行以下命令:
rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl delete_queue

嗯,我在基于Unix的操作系统上运行它并且成功了,只要确保传递给xargs命令的结果是正确的即可。 - Mohammad Naseri
对于alpine,如果你遇到了“unrecognized option: L”的问题,请安装“findutils”软件包 - 它将为你提供GNU版本的xargs。 - Ersain
对于alpine,如果你遇到了“未识别选项:L”的问题,请安装“findutils”软件包 - 它将为你提供GNU版本的xargs。 - undefined

22

试一试:

 rabbitmqadmin list queues name | awk '{print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn

2
这对我有用,但也显示了 *** Not found: /api/queues/%2F/name,因为输出是一个带有“name”列的ASCII表格。我调整了命令为rabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn来解决它。 - Mark Edington
1
rabbitmqadmin list queues name | awk {'print$2'} | egrep [^name] | xargs -I qname rabbitmqadmin delete queue name=qname - Scott Leonard

15

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

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


rabbitmqctl 中没有 delete_queuepurge_queue 命令。我想清空许多似乎是自动生成的队列,但我不想安装额外的软件,如 rabbitmqadmin... - Rolice
rabbitmqctl purge_queue 在这里手动工作。我只需要添加 -p <虚拟主机>。 - Roman Susi
与@Rolice上面所说的相反,rabbitmqctl中都提供了delete_queuepurge_queue,我刚刚成功地运行了它们。也许你使用的是旧版本。 - Richard Dunn
很高兴听到这个消息,这些可能是最近添加的。 - Rolice

13

如果你试图删除队列,因为它们没有使用而且你不想重置,一种选择是通过策略将队列的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


1
这是最快的方式。 - paivaric
绝对是最好的方式 - ln -s

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的人要少见。
祝您使用愉快!

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)
 }

注意,这仅删除非空队列。删除所有队列请移除 -gt 子句。 - Peter Goodman

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。

rabbitmqadmin 不可用时非常适用。 - NuSkooler
我发现这比list_queues快得多。 - TerrenceSun
有人尝试过在RabbitMQ v3.8.2或更高版本中使用这个解决方案吗?我似乎遇到了一些未定义的Erlang错误。也许需要更新解决方案以反映更新的版本? - ckatsara
我尝试了与上面类似的命令,但在 ^ 之前遇到语法错误。以下是我的命令。kubectl exec -n kayaks svc/rabbitmq-ha -- rabbitmqctl --vhost=AM-Dev eval 'IfUnused = false, IfEmpty = true, MatchRegex = <<"^WOMSProvisioningSubscrptionQueue_platform-">>, [rabbit_amqqueue:delete(Q, IfUnused, IfEmpty) || Q <- rabbit_amqqueue:list(), re:run(element(4, element(2, Q)), MatchRegex) =/= nomatch ].' - ckv

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