从RabbitMQ中删除所有队列?

时间:2012-07-12 19:59:37

标签: rabbitmq rabbitmqctl

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

23 个答案:

答案 0 :(得分:252)

首先,列出你的队列:

rabbitmqadmin list queues name

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

rabbitmqadmin delete queue name='queuename'

由于输出格式不显示,您可以从list queues获取响应。或者,如果您只想找到清除所有内容的方法(阅读:重置所有设置,将安装恢复为默认状态),请使用:

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

答案 1 :(得分:46)

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

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

答案 2 :(得分:19)

试试这个:

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

答案 3 :(得分:17)

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

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

  • 转到“管理员” 标签

  • 转到策略标签(位于右侧)

  • 添加政策

  • 填充字段

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

  • 再次
  • 结帐队列标签
  • 必须删除所有队列
  • 别忘了删除政策!!!!!

答案 4 :(得分:8)

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

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

答案 5 :(得分: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"

如果您希望对传入的参数进行不同的匹配,则可以在第4行中更改grep。当删除所有队列时,它不会删除其中有三个连续空格的队列,因为我认为可能性比使用rabbitmqctl以不同语言打印输出的人更少。

享受!

答案 6 :(得分: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

答案 7 :(得分:5)

以下是使用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)
 }

答案 8 :(得分:3)

您可以使用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 ].' 

以上将删除所有具有名称的vhost中的所有空队列 以“prefix-”开头。 您可以编辑变量IfUnused,IfEmpty, 和MatchRegex根据您的要求。

答案 9 :(得分:3)

使用rabbitmqctl one liner删除所有队列

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

答案 10 :(得分:2)

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

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

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

答案 11 :(得分:2)

要列出队列,

./rabbitmqadmin -f tsv -q list queues

要删除队列,

./rabbitmqadmin delete queue name=name_of_queue

答案 12 :(得分:2)

在Rabbit版本3.7.10中,您可以在具有root权限的情况下运行以下命令:

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

答案 13 :(得分:1)

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

答案 14 :(得分: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{},并替换命令中的{}

答案 15 :(得分:1)

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

答案 16 :(得分:1)

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

注意:这仅适用于默认的vhost /

答案 17 :(得分: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'

答案 18 :(得分:0)

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

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

答案 19 :(得分:0)

好的,这个答案的重要资格: 问题确实要求使用 rabbitmqctl rabbitmqadmin 来解决这个问题,我的答案需要同时使用它们。另请注意,这是在MacOS 10.12.6上测试的,以及在安装带有Homebrew的rabbitmq时安装的 rabbitmqctl rabbitmqadmin 的版本,并且标识为{{1 } rabbitmq 3.7.0

brew list --versions

答案 20 :(得分:0)

另一个选择是删除与队列关联的虚拟主机。这将删除与虚拟主机相关的所有 ,因此请注意,但这很容易且快捷。


注意: RabbitMQ团队监视the rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。

答案 21 :(得分: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 ...并没有为我做。它总是在第一个队列名称处停止。

答案 22 :(得分:-1)

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