Видалити всі черги з RabbitMQ?


188

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

Відповіді:


271

Спочатку перерахуйте свої черги:

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 скидання" поверне все до "заводських налаштувань". Будь-які користувачі RabbitMQ, віртуальні хости тощо, які ви створили, будуть здуті.
Тюфек

Вибачення @ smartnut007, я пояснив другу частину відповіді запереченням.
lukiffer

24
просто хапаючи порожні черги. 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

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
приблизно так

48

Насправді дуже просто з плагіном управління та політикою:

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

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

  • Goto політики Вкладка (на правій стороні)

  • Додати політику

  • Заповнення полів

    • Віртуальний хост: Виберіть
    • Ім'я: термін дії всієї політики (видалити пізніше)
    • Візерунок:. *
    • Застосувати до: Черги
    • Визначення: термін дії закінчується зі значенням 1 (тип зміни з рядка на номер)
  • Зберегти

  • Знову вкладка Черги на замовлення
  • Усі черги потрібно видалити
  • І не забудьте видалити політику !!!!!! .

1
виберіть "Число" за визначенням. Не працює за замовчуванням ("Рядок")
Матіас

Чудова відповідь, насправді склав мій день. Якщо ви вибрали зі списку "Обмін і черги", ви можете легко видалити і Черги, і Обміни. Я хотів би, щоб це могла бути прийнятою відповіддю.
Wiktor Zychla

Дуже чисте рішення, без необхідності грати навколо екземпляра SSH.
acidburn23

Шкода, ніхто не пояснює, як встановити плагін управління та політики
gelonida

@MesutA. Дуже дякую. Я думаю, що добре, щоб у цій статті було посилання. Можливо, ще краще додати його до відповіді, оскільки коментарі можуть бути очищені. Але я маю принаймні цю інформацію
gelonida

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
Скотт Леонард

9

Якщо у вас не встановлено rabbitmqadmin, спробуйте очистити черги за допомогою rabbitmqctl:

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


Немає delete_queueні purge_queueкоманд в rabbitmqctl. Я хотів би очистити багато черг, які, як видається, автоматично генеруються, і я не хотів би встановлювати додаткове програмне забезпечення, наприклад rabbitmqadmin...
Rolice

rabbitmqctl purge_queueпрацювали тут вручну. Мені потрібно було лише додати -p <virtual-host>
Роман Сузі

Всупереч сказаному вище @Rolice, обидва є delete_queueі purge_queueдоступні в, rabbitmqctlі я просто їх успішно запускаю. Можливо, ви на старій версії.
Річард Данн

Приємно це почути, вони могли бути додані нещодавно.
Rolice

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"

Якщо ви хочете відрізняти відповідність аргументам, які ви передаєте, ви можете змінити греп у четвертому рядку. Видаляючи всі черги, вони не видалять їх з трьома послідовними пробілами в них, тому що я вважав, що випадковість буде рідше, ніж люди, у яких rabbitmqctl друкує її вихід на різних мовах.

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


6

У кролі версії 3.7.10 ви можете запустити команду нижче з дозволом root:

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

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, які мають назву, що починається з "префікса-". Ви можете редагувати змінні IfUnused, IfEmpty та MatchRegex відповідно до ваших вимог.


Ідеально підходить, коли rabbitmqadminнедоступний.
NuSkooler

Я знайшов це набагато швидше, ніж list_queues
TerrenceSun

3

Видалення всіх черг за допомогою rabbitmqctl одного вкладиша

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 і скинути команди, але вони дуже повільні.

Це найшвидший спосіб, який я знайшов (замініть ваше ім’я користувача та пароль):

#!/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

Ось більш швидка версія (використовуючи 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)


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 не має просто команди "скинути всі черги".
судо

До речі, щоб отримати rabbitmqadmin, вам потрібно перейти http://yourhost:15672/cli/і завантажити його.
судо

1

Вам не потрібно скидати сервер rabbitmq для видалення нестійких черг. Просто зупиніть сервер і запустіть його знову, і він видалить усі нестабільні черги.


включаючи довговічні черги? Я не думаю, що так. Я кваліфікую вашу відповідь.
Хенді Іраван

Ні, довговічні черги не можна видалити, зупинивши сервер. Їх можна видалити з веб-інтерфейсу RabbitMQ Management під чергами.
ErAcube

Насправді так, це допомогло мені, і близько 4500 автоматично сформованих черг вже не було. Здається, це були нетривалі. Дякую!
Роліса

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 /.

Єдине, що вам потрібно буде відновити - це дозволи для новоствореного 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, пов’язаний з чергами. Це видалить усе, що пов’язане з 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
Я отримую це під час його запуску: голова: незаконне число ліній - -1
Роберт Росс,

"Голова -n-1" повинна бути або "голова -1", або "голова -n 1"
Герд Бускер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.