从RabbitMQ删除所有队列?


188

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

Answers:


272

首先,列出您的队列:

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

4
查看rabbitmq中所有待处理的任务:rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged
Guillaume Vincent

2
请注意,“ rabbitmqctl reset”会将所有内容重置为“ factory settings”。您创建的任何RabbitMQ用户,虚拟主机等都会被吹走。
thoufek 2014年

抱歉@ smartnut007,我用免责声明阐明了答案的第二部分。
lukiffer 2014年

24
只是抓住空荡荡的队列。rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
au_stan 2014年

4
@au_stan这将删除名称或计数为0的所有队列。可能想grep $'\t0'做某事。
活泉

51

使用以下rabbitmqadmin单线即可删除它们:

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

在我的情况下,队列以可以简单使用的关键字作为前缀egrep,因此我的命令将如下所示:rabbitmqadmin -f tsv -q list queues name | egrep "%search word%" | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
Logans'Oct

47

使用管理插件和策略实际上超级简单:

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

  • 转到管理标签

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

  • 新增政策

  • 填写栏位

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

  • 再次签出队列标签
  • 必须删除所有队列
  • 并且不要忘记删除策略!!!!

1
在“定义”中选择“数字”。不适用于默认值(“字符串”)
Mathias

很好的答案,实际上弥补了我的不足。如果从列表中选择“交换和队列”,则可以轻松删除队列和交换。我希望这是可以接受的答案。
Wiktor Zychla

非常干净的解决方案,无需使用实例SSH。
acidburn23年

可惜没有人解释如何安装管理插件和策略
gelonida

@MesutA。非常感谢。我认为在本文中具有此链接是很好的。将其添加到答案中可能会更好,因为注释可能会被清除。但是我现在至少有了此信息
gelonida

19

试试这个:

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

2
这对我有用,但也显示出来,*** Not found: /api/queues/%2F/name因为输出是带有“名称”列的ASCII表。我调整了该命令以对其rabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn进行修复。
Mark Edington

rabbitmqadmin list queues name | awk {'print$2'} | egrep [^name] | xargs -I qname rabbitmqadmin delete queue name=qname
Scott Leonard

9

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

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


中没有delete_queuenor purge_queue命令rabbitmqctl。我想清除很多似乎自动生成的队列,并且我不想安装其他软件,例如rabbitmqadmin...
Rolice

rabbitmqctl purge_queue在这里手动工作。我只需要添加-p <virtual-host>
Roman Susi 18'Feb

相反的是@Rolice如上所述,无论是delete_queuepurge_queue在可rabbitmqctl我刚把它们运行成功。也许您使用的是旧版本。
理查德·邓

很高兴听到这些消息,这些可能是最近添加的。
罗里斯

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

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



5

这是使用PowerShell执行此操作的一种方法。网址可能需要更新

$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 2015年

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

3

使用RabbitMQCTL One班轮删除所有队列

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

2

如果您只想清除不为空的队列(快得多):

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

对我来说,清除一个队列(空的和非空的)需要2-3秒,因此遍历50个队列非常痛苦,而我只需要清除10个队列(40/50是空的)。


2

我尝试了rabbitmqctl并重置了命令,但是它们非常慢。

这是我找到的最快方法(替换您的用户名和密码):

#!/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/@

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



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)


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


我已经尝试了10种不同的答案,但这是在不删除所有其他设置的情况下实际上可以删除队列的唯一方法。谢谢!我不敢相信rabbitmqctl不仅有一个“删除所有队列”命令。
sudo

顺便说一句,要获取rabbitmqadmin,您需要转到http://yourhost:15672/cli/并下载它。
sudo

1

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


包括持久队列?我不这么认为。我将限定您的答案。
Hendy Irawan

不,不能通过停止服务器删除持久队列。可以从RabbitMQ Management Web界面的队列下删除它们。
ErAcube

实际上,是的,这对我有所帮助,并且约4500个自动生成的队列都消失了。看来这些是非耐用的。谢谢!
罗里斯

1

对于谁有安装rabbitmqadmin的问题,您应该首先安装python。

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

Windows用户将需要确保Python在其PATH上,并将rabbitmqadmin调用为python.exe 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'

0

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

您唯一需要还原的就是新创建的虚拟主机的权限。


0

好的,此答案的重要限定词:该问题确实要求使用RabbitmqctlRabbitmqadmin来解决此问题,我的答案需要同时使用两者。另外,请注意,这已在MacOS 10.12.6上进行了测试,并在使用Homebrew安装rabbitmq时安装了rabbitmqctlrabbitmqadmin版本,并标识brew list --versionsrabbitmq 3.7.0。

rabbitmqctl list_queues -p <VIRTUAL_HOSTNAME> name | sed 1,2d | xargs -I qname rabbitmqadmin --vhost <VIRTUAL_HOSTNAME> delete queue name=qname



0

我尝试了以上代码,但没有进行任何流式处理。

sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done

我生成了一个包含所有队列名称的文件,并逐行循环删除它们。对于循环,while read ...没有为我做。它总是在第一个队列名称处停止。


-1
rabbitmqadmin list queues|awk 'NR>3{print $4}'|head -n-1|xargs -I qname rabbitmqadmin delete queue name=qname

1
我在运行时收到此消息:头:非法行数--1
罗伯特·罗斯

“ head -n-1”应该是“ head -1”或“ head -n 1”
Gerd Busker 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.