Удалить все очереди из 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