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


192

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

Ответы:


275

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

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

4
чтобы увидеть все незавершенные задачи в rabbitmq:rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged
Гийом Винсент

2
Имейте в виду, что «rabbitmqctl reset» вернет все к «заводским настройкам». Любые пользователи RabbitMQ, виртуальные хосты и т. Д., Которые вы создали, будут поражены.
thoufek

Извинения @ smartnut007, я пояснил вторую часть ответа с оговоркой.
lukiffer

25
просто хватаю пустые очереди. rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
au_stan

4
@au_stan Это удалит все очереди с 0 в имени или количестве. Может, захочешь что- grep $'\t0'нибудь сделать .
woot

53

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

  • Консоль управления Goto (localhost: 15672)

  • Перейти на вкладку администратора

  • Вкладка Goto Policies (справа)

  • Добавить политику

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

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

  • Вкладка Checkout Queues снова
  • Все очереди должны быть удалены
  • И не забудьте удалить политику !!!!!! .

1
выберите «Число» в разделе «Определение». Не работает по умолчанию («Строка»)
Матиас

Отличный ответ, на самом деле сделал мой день. Если вы выберете «Обмены и очереди» из списка, вы можете легко удалить как очереди, так и биржи. Я бы хотел, чтобы это был принятый ответ.
Виктор Зихла

Очень чистое решение, без необходимости возиться с экземпляром SSH.
acidburn23

Жалко, никто не объясняет, как установить плагин управления и политики
gelonida

@MesutA. Большое спасибо. Я думаю, что эта ссылка есть в этой статье. Возможно, было бы даже лучше добавить его к ответу, поскольку комментарии могут быть удалены. Но теперь у меня есть по крайней мере эта информация
gelonida

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
Логанс

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чтобы исправить это.
Марк Эдингтон

rabbitmqadmin list queues name | awk {'print$2'} | egrep [^name] | xargs -I qname rabbitmqadmin delete queue name=qname
Скотт Леонард

10

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

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


Нет delete_queueни purge_queueкоманд rabbitmqctl. Я хотел бы очистить множество очередей, которые, похоже, rabbitmqadmin
создаются

rabbitmqctl purge_queueздесь работал вручную. Мне нужно было только добавить -p <virtual-host>
Роман Суси

Вопреки тому, что @Rolice заявил выше, оба delete_queueи purge_queueдоступны, rabbitmqctlи я только что успешно их запустил. Возможно у вас старая версия.
Ричард Данн

Приятно это слышать, они могли быть добавлены недавно.
Rolice

10

В версии Rabbit 3.7.10 вы можете выполнить следующую команду с правами root:

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

7

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


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 выводит свои данные на разных языках.

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


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

Обратите внимание, что при этом удаляются только непустые очереди. Удалите предложение -gt, чтобы удалить все очереди
Питер Гудман

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 ].' 

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


Идеально rabbitmqadminподходит, когда недоступен.
NuSkooler,

Я нашел это намного быстрее, чем list_queues
TerrenceSun

3

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

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 и 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 / по умолчанию.



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 удалить недлительную очередь. Просто остановите сервер и запустите снова, и он удалит все доступные недолговечные очереди.


включая длительные очереди? Я так не думаю. Я уточню ваш ответ.
Хенди Ираван

Нет, устойчивые очереди нельзя удалить путем остановки сервера. Их можно удалить из веб-интерфейса RabbitMQ Management в очередях.
ErAcube

На самом деле да, это помогло мне, и все около 4500 автоматически сгенерированных очередей исчезли. Похоже, это были недолговечные. Благодарность!
Rolice

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

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


0

Другой вариант - удалить виртуальный хост, связанный с очередями. Это удалит все, что связано с vhost, так что имейте в виду, но это легко и быстро.


ПРИМЕЧАНИЕ: команда RabbitMQ следит за rabbitmq-usersсписком рассылки и лишь иногда отвечает на вопросы о StackOverflow.


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
Я получаю это при запуске: head: неправильное количество строк - -1
Роберт Росс

«Head -n-1» должно быть либо «head -1», либо «head -n 1»
Герд Бускер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.