首页 文章

从RabbitMQ中删除所有队列?

提问于
浏览
162

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

19 回答

  • 6

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

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

    试试这个:

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

    首先,列出你的队列:

    rabbitmqadmin list queues name

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

    rabbitmqadmin delete queue name='queuename'

    由于输出格式,不会出现您可以从 list queues grep响应 . 或者,如果您只是想要清除所有内容的方法(阅读: reset all settings ,将安装返回到默认状态),请使用:

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

    我创建了一个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以不同语言打印输出的人更少 .

    请享用!

  • 0

    如果're trying to delete queues because they'未使用且您不想重置,则一个选项是通过策略将队列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

  • 0

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

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

  • 3

    这是使用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)
     }
    
  • 242

    Actually super easy with management plugin and policies:

    • 转到 Management Console (localhost:15672)

    • 转到 Admin 标签

    • 转到 Policies 标签(右侧)

    • 添加 Policy

    • 填充字段

    • Virtual Host: 选择

    • Name: 使所有政策失效(稍后删除)

    • Pattern: . *

    • Apply to: 队列

    • Definition: expires ,其值为 1

    • 保存

    • 再次签出 Queues 标签

    • 必须删除所有队列

    • And don't forget remove policy!!!!!! .

  • 5

    您可以使用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-”开头的vhost中的所有空队列 . 您可以根据需要编辑变量IfUnused,IfEmpty和MatchRegex .

  • 19

    使用rabbitmqctl one liner删除所有队列

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

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

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

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

  • 2

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

  • 3

    此命令将删除所有队列

    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{} ,并在命令中替换 {} .

  • -1

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

  • 1

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

    您需要还原的唯一内容是新创建的vhost的权限 .

  • 6

    好的,这个答案的重要限定符:问题确实要求使用 rabbitmqctlrabbitmqadmin 来解决这个问题,我的答案需要同时使用 . 另请注意,这是在MacOS 10.12.6上测试的,以及在安装带有Homebrew的rabbitmq时安装的 rabbitmqctlrabbitmqadmin 的版本,并且 brew 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

  • 6

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

  • 1

    列出队列,

    ./rabbitmqadmin -f tsv -q list queues
    

    要删除队列,

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

相关问题