Удалить все очереди из RabbitMQ?

Я установил rabbitmqadmin и смог перечислить все биржи и очереди. Как я могу использовать rabbitmqadmin или rabbitmqctl для удаления всех очередей.

18 ответов


сначала перечислите свои очереди:

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

С rabbitmqadmin вы можете удалить их с фразой:

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

попробуйте это:

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

Я сделал 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 печатает свой вывод на разных языках.

наслаждайтесь!


Если у вас не установлен rabbitmqadmin, попробуйте очистить очереди с помощью rabbitmqctl:

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


вот способ сделать это с помощью 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)
 }

Если вы пытаетесь удалить очереди, потому что они не используются, и вы не хотите сбрасывать, один из вариантов-установить 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


вы можете использовать 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 ].' 

вышеуказанное удалит все пустые очереди во всех vhosts, которые имеют имя начиная с префиксом" -". Вы можете редактировать переменные IfUnused, IfEmpty, и MatchRegex согласно вашему требованию.


удаление всех очередей с помощью rabbitmqctl one liner

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

вот более быстрая версия (с помощью parallel install 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)


эта команда удаляет все ваши очереди

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{} это запустит следующую команду и заменит {} в командной строке.


вам не нужно сбрасывать сервер rabbitmq для удаления non-durable очереди. Просто остановите сервер и начните снова, и он удалит все non-durable очередей доступны.


на самом деле очень легко с плагином управления и политики:

  • перейти Консоль (localhost:15672)

  • перейти Admin tab

  • перейти политика tab (справа)

  • добавить политика

  • Заполнить Поля

    • Виртуальный Хост: Выберите
    • название: Удалить Все Политики(Удалить Позже)
    • шаблон: .*
    • применяется для: очереди
    • определение: истекает со значением 1
  • сохранить

  • оформить заказ очереди tab снова
  • все очереди должны быть удалены
  • и не забудьте удалить политика!!!!!!.

есть способ удалить все очереди и обмены без скриптов и полный сброс. Вы можете просто удалить и повторно создать виртуальный хост из интерфейса администратора. Это будет работать даже для vhost /.

единственное, что вам нужно восстановить, это разрешения для вновь созданного vhost.


хорошо, важный квалификатор для этого ответа: Вопрос просит использовать либо rabbitmqctl или rabbitmqadmin чтобы решить эту проблему, мой ответ должен был использовать оба. Кроме того, обратите внимание, что это было протестировано на MacOS 10.12.6 и версиях rabbitmqctl и rabbitmqadmin которые устанавливаются при установке rabbitmq с Homebrew и которые идентифицируются с brew list --versions as 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


Если вы хотите только очистить очереди, которые не пусты (намного быстрее):

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

для меня требуется 2-3 секунды, чтобы очистить очередь (как пустую, так и непустую), поэтому итерация через 50 очередей-такая боль, в то время как мне просто нужно очистить 10 из них (40/50 пусты).


Я пробовал команды 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/@

Примечание: это работает только с vhost по умолчанию/


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