Usunąć wszystkie kolejki z RabbitMQ?


188

Zainstalowałem rabbitmqadmini mogłem wyświetlić listę wszystkich wymian i kolejek. Jak mogę użyć rabbitmqadminlub rabbitmqctlusunąć wszystkie kolejki.

Odpowiedzi:


271

Najpierw wypisz kolejki:

rabbitmqadmin list queues name

Następnie z listy musisz ręcznie usunąć je kolejno:

rabbitmqadmin delete queue name='queuename'

Ze względu na format wyjściowy, nie wydaje się, że możesz grep odpowiedź list queues. Alternatywnie, jeśli szukasz sposobu na wyczyszczenie wszystkiego (przeczytaj: zresetuj wszystkie ustawienia , przywróć instalację do stanu domyślnego), użyj:

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

4
aby zobaczyć wszystkie oczekujące zadania w rabbitmq:rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged
Guillaume Vincent

2
Należy pamiętać, że „resetowanie królika” zresetuje wszystko z powrotem do „ustawień fabrycznych”. Każdy utworzony użytkownik RabbitMQ, wirtualne hosty itp. Zostanie zdmuchnięty.
ty

Przepraszam @ smartnut007, wyjaśniłem drugą część odpowiedzi z zastrzeżeniem.
lukiffer

24
po prostu chwytam puste kolejki. rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
au_stan

4
@au_stan To usunie wszystkie kolejki z 0 w nazwie lub liczbie. Może chcę grep $'\t0'coś zrobić .
woot

51

Dzięki rabbitmqadminmożesz je usunąć za pomocą tej jednowarstwowej:

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

W moim przypadku kolejki są poprzedzone słowem kluczowym, za pomocą którego mogę po prostu użyć egrep, więc moje polecenie będzie wyglądać następująco:rabbitmqadmin -f tsv -q list queues name | egrep "%search word%" | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
Logans

48

Właściwie bardzo łatwe dzięki wtyczce do zarządzania i zasadom:

  • Goto Management Console (localhost: 15672)

  • Przejdź do karty administratora

  • Przejdź do zakładki Zasady (po prawej stronie)

  • Dodaj zasadę

  • Wypełnij pola

    • Wirtualny host: wybierz
    • Nazwa: Wygasają wszystkie zasady (Usuń później)
    • Wzór:. *
    • Zastosuj do: Kolejki
    • Definicja: wygasa z wartością 1 (zmiana typu z String na Number)
  • Zapisać

  • Karta Kolejki kasy ponownie
  • Wszystkie kolejki muszą zostać usunięte
  • I nie zapomnij usunąć polityki !!!!!! .

1
wybierz „Numer” w Definicja. Nie działa z ustawieniem domyślnym („String”)
Mathias

Świetna odpowiedź, właściwie zrobiła mi dzień. Jeśli wybierzesz „Giełdy i kolejki” z listy, możesz łatwo usunąć zarówno kolejki, jak i giełdy. Chciałbym, żeby to była zaakceptowana odpowiedź.
Wiktor Zychla,

Bardzo czyste rozwiązanie, bez potrzeby zabawy wokół instancji SSH.
acidburn23

Szkoda, że ​​nikt nie wyjaśnia, jak zainstalować wtyczkę i zasady zarządzania
gelonida,

@MesutA. Wielkie dzięki. Myślę, że dobrze jest mieć ten link w tym artykule. Jeszcze lepiej byłoby dodać ją do odpowiedzi, ponieważ komentarze mogą zostać usunięte. Ale mam teraz przynajmniej tę informację
gelonida,

19

Spróbuj tego:

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

2
To działało dla mnie, ale pokazało również, *** Not found: /api/queues/%2F/nameponieważ wynikiem jest tabela ASCII z kolumną „nazwa”. Poprawiłem polecenie, aby je rabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qnnaprawić.
Mark Edington

rabbitmqadmin list queues name | awk {'print$2'} | egrep [^name] | xargs -I qname rabbitmqadmin delete queue name=qname
Scott Leonard,

9

Jeśli nie masz zainstalowanego rabbitmqadmin, spróbuj wyczyścić kolejki za pomocą rabbitmqctl:

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


Nie ma żadnych poleceń delete_queueani purge_queuepoleceń rabbitmqctl. Chciałbym wyczyścić wiele kolejek, które wydają się być generowane automatycznie i nie chciałbym instalować dodatkowego oprogramowania, takiego jak rabbitmqadmin...
Rolice

rabbitmqctl purge_queuepracował tu ręcznie. Musiałem tylko dodać -p <wirtualny host>
Roman Susi

Wbrew temu, co @Rolice stwierdzono powyżej, zarówno delete_queuei purge_queuesą dostępne rabbitmqctl, a ja po prostu uruchomić je pomyślnie. Być może korzystasz ze starej wersji.
Richard Dunn

Dobrze to słyszeć, mogły zostać dodane niedawno.
Rolice,

7

Jeśli próbujesz usunąć kolejki, ponieważ są nieużywane i nie chcesz resetować, jedną z opcji jest ustawienie bardzo niskiego poziomu TTL w kolejce za pomocą zasad, poczekaj, aż kolejki zostaną automatycznie usunięte po przekroczeniu TTL a następnie usuń zasady ( https://www.rabbitmq.com/ttl.html ).

rabbitmqctl.bat set_policy delq ".*" '{"expires": 1}' --apply-to queues

Aby usunąć zasadę

rabbitmqctl clear_policy delq

Pamiętaj, że działa to tylko w przypadku nieużywanych kolejek

Oryginalne informacje tutaj: http://rabbitmq.1065348.n5.nabble.com/Deleting-all-queues-in-rabbitmq-td30933.html


6

Zrobiłem deleteRabbitMqQs.sh, który akceptuje argumenty do przeszukania listy kolejek, wybierając tylko te pasujące do żądanego wzorca. Jeśli nie podasz żadnych argumentów, usunie je wszystkie! Pokazuje listę kolejek, które ma zamiar usunąć, pozwalając ci wyjść zanim zrobisz coś destrukcyjnego.

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"

Jeśli chcesz inaczej dopasowywać argumenty, które przekazujesz, możesz zmienić grep w czwartym wierszu. Usuwając wszystkie kolejki, nie usunie tych z trzema kolejnymi spacjami, ponieważ doszedłem do wniosku, że ewentualność byłaby rzadsza niż ludzie, którzy wyświetlają wyniki w różnych językach przez program rabbitmqctl.

Cieszyć się!


6

W wersji Rabbit 3.7.10 możesz uruchomić poniżej polecenia z uprawnieniami roota:

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

5

Oto sposób, aby to zrobić za pomocą PowerShell. adres URL może wymagać aktualizacji

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

Uwaga: usuwa to tylko niepuste kolejki. Usuń klauzulę -gt, aby usunąć wszystkie kolejki
Peter Goodman

4

Możesz użyć evolmaxmql jak poniżej:

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

Powyższe spowoduje usunięcie wszystkich pustych kolejek na wszystkich hostach vhost, których nazwa zaczyna się od „prefix-”. Możesz edytować zmienne IfUnused, IfEmpty i MatchRegex zgodnie z wymaganiami.


Idealny, gdy rabbitmqadminnie jest dostępny.
NuSkooler

Znalazłem to znacznie szybciej niż list_queues
TerrenceSun

3

Usuwanie wszystkich kolejek za pomocą jednego linijki rabbitmqctl

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

2

Jeśli chcesz tylko wyczyścić kolejki, które nie są puste (znacznie szybciej):

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

Dla mnie czyszczenie kolejki (zarówno pustej, jak i niepustej) zajmuje 2-3 sekundy, więc iteracja po 50 kolejkach to taki ból, a ja po prostu muszę wyczyścić 10 z nich (40/50 są puste).


2

Próbowałem polecenia rabbitmqctl i resetowania, ale są one bardzo wolne.

Jest to najszybszy sposób, jaki znalazłem (zastąp swoją nazwę użytkownika i hasło):

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

Uwaga: Działa to tylko z domyślnym vhost /


2

Aby wyświetlić kolejki,

./rabbitmqadmin -f tsv -q list queues

Aby usunąć kolejkę,

./rabbitmqadmin delete queue name=name_of_queue

1

Oto szybsza wersja (korzystająca z parallelinstalacji sudo apt-get install równolegle) rozwijająca się na doskonałej odpowiedzi autorstwa @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

To polecenie usuwa wszystkie twoje kolejki

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={}

Ten skrypt jest bardzo prosty, ponieważ używa -f bash, który wyświetla kolejki jako listę.

Następnie używamy xargs -n1do podzielenia tego na wiele zmiennych

Następnie użyjemy polecenia xargs -I{}, które uruchomi polecenie i zastąpi {}polecenie.


Próbowałem 10 różnych odpowiedzi i jest to jedyna rzecz, która faktycznie działała, aby usunąć kolejki bez usuwania wszystkich innych ustawień. Dzięki! Nie mogę uwierzyć, że rabbitmqctl nie ma po prostu polecenia „upuść wszystkie kolejki”.
sudo

BTW, aby zdobyć rabbitmqadmin, musisz go http://yourhost:15672/cli/pobrać i pobrać.
sudo

1

Nie musisz resetować serwera rabbitmq, aby usunąć nietrwałe kolejki. Po prostu zatrzymaj serwer i uruchom ponownie, a usunie wszystkie dostępne niestabilne kolejki.


w tym trwałe kolejki? Nie wydaje mi się Kwalifikuję twoją odpowiedź.
Hendy Irawan

Nie, trwałe kolejki nie mogą zostać usunięte poprzez zatrzymanie serwera. Można je usunąć z interfejsu internetowego RabbitMQ Management w kolejkach.
ErAcube,

Właściwie tak, pomogło mi to i zniknęło około 4500 automatycznie wygenerowanych kolejek. Wydaje się, że były to nietrwałe. Dzięki!
Rolice,

1

Dla których masz problem z instalacją rabbitmqadmin, powinieneś najpierw zainstalować Pythona.

Użytkownicy systemu operacyjnego podobnego do UNIX-a muszą skopiować rabbitmqadmin do katalogu w PATH, np. / Usr / local / bin.

Użytkownicy systemu Windows będą musieli upewnić się, że Python znajduje się na ich ŚCIEŻCE i wywołać rabbitmqadmin jako python.exe rabbitmqadmin.

Następnie

  1. Przeglądaj, http://{hostname}:15672/cli/rabbitmqadminaby pobrać.
  2. Przejdź do folderu zawierającego, a następnie uruchom polecenie cmd z uprawnieniami administratora

Aby wyświetlić kolejki python rabbitmqadmin list queues .

Aby usunąć kolejkę python rabbitmqadmin delete queue name=Name_of_queue

Aby usunąć wszystkie kolejki

1- Deklaracja zasad

python rabbitmqadmin declare policy name='expire_all_policies' pattern=.* definition={\"expires\":1} apply-to=queues

2- Usuń politykę

python rabbitmqadmin  delete policy name='expire_all_policies'

0

Istnieje sposób na usunięcie wszystkich kolejek i wymian bez skryptów i pełnego resetowania. Możesz po prostu usunąć i ponownie utworzyć wirtualnego hosta z interfejsu administratora. Działa to nawet dla vhosta /.

Jedyne, co musisz przywrócić, to uprawnienia do nowo utworzonego vhosta.


0

OK, ważny kwalifikator dla tej odpowiedzi: Pytanie wymaga użycia albo rabbitmqctl LUB rabbitmqadmin, aby rozwiązać ten problem, moja odpowiedź wymagała użycia obu. Należy również pamiętać, że zostało to przetestowane w systemie MacOS 10.12.6 i wersjach programów rabbitmqctl i rabbitmqadmin, które są instalowane podczas instalowania programu rabbitmq z Homebrew i które są identyfikowane brew list --versionsjako królikmq 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

Inną opcją jest usunięcie vhosta związanego z kolejkami. Spowoduje to usunięcie wszystkiego związanego z vhostem, więc ostrzegaj, ale jest to łatwe i szybkie.


UWAGA: zespół RabbitMQ monitoruje na rabbitmq-userslistę mailingową i tylko czasami odpowiada na pytania na StackOverflow.


0

Próbowałem powyższych fragmentów kodu, ale nie przesyłałem strumieniowo.

sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done.

Generuję plik, który zawiera wszystkie nazwy kolejek i pętle przez linię do linii, aby je usunąć. W przypadku pętli while read ...nie zrobiłem tego dla mnie. Zawsze zatrzymywało się przy pierwszej nazwie kolejki.


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

1
Otrzymuję to po uruchomieniu: głowa: nielegalna liczba linii - -1
Robert Ross

„Head -n-1” powinien być albo „head -1”, albo „head -n 1”
Gerd Busker
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.