Alle Warteschlangen aus RabbitMQ löschen?


188

Ich habe rabbitmqadminalle Börsen und Warteschlangen installiert und konnte sie auflisten. Wie kann ich alle Warteschlangen verwenden rabbitmqadminoder rabbitmqctllöschen?

Antworten:


272

Listen Sie zunächst Ihre Warteschlangen auf:

rabbitmqadmin list queues name

Dann müssen Sie sie einzeln manuell aus der Liste löschen:

rabbitmqadmin delete queue name='queuename'

Wird aufgrund des Ausgabeformats nicht angezeigt, können Sie die Antwort von abrufen list queues. Wenn Sie nur nach einer Möglichkeit suchen, alles zu löschen (lesen Sie: Alle Einstellungen zurücksetzen , die Installation auf den Standardzustand zurücksetzen ), verwenden Sie alternativ :

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

4
um alle anstehenden Aufgaben in rabbitmq zu sehen:rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged
Guillaume Vincent

2
Beachten Sie, dass "rabbitmqctl reset" alles auf die "Werkseinstellungen" zurücksetzt. Alle von Ihnen erstellten RabbitMQ-Benutzer, virtuellen Hosts usw. werden weggeblasen.
thoufek

Entschuldigung @ smartnut007, ich habe den zweiten Teil der Antwort mit einem Haftungsausschluss geklärt.
Luzifer

24
Ich greife nur nach den leeren Warteschlangen. rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
Au_stan

4
@au_stan Damit werden alle Warteschlangen mit einer 0 im Namen oder in der Anzahl gelöscht. Könnte wollen grep $'\t0'oder so.
woot

51

Mit können rabbitmqadminSie sie mit diesem Einzeiler entfernen:

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

In meinem Fall wird den Warteschlangen ein Schlüsselwort vorangestellt, das ich einfach verwenden kann egrep, sodass mein Befehl folgendermaßen aussieht:rabbitmqadmin -f tsv -q list queues name | egrep "%search word%" | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
Logans

47

Eigentlich super einfach mit Management Plugin und Richtlinien:

  • Goto Management Console (localhost: 15672)

  • Gehe zu Admin Registerkarte

  • Goto Richtlinien Registerkarte (auf der rechten Seite)

  • Richtlinie hinzufügen

  • Felder füllen

    • Virtueller Host: Wählen Sie
    • Name: Alle Richtlinien ablaufen lassen (später löschen)
    • Muster : . *
    • Anwenden auf: Warteschlangen
    • Definition: läuft mit Wert 1 ab (Typ von String in Number ändern)
  • sparen

  • Registerkarte " Checkout- Warteschlangen" erneut
  • Alle Warteschlangen müssen gelöscht werden
  • Und vergessen Sie nicht, Richtlinien zu entfernen !!!!!! .

1
Wählen Sie "Nummer" bei Definition. Funktioniert nicht mit Standard ("String")
Mathias

Tolle Antwort, hat meinen Tag wirklich gut gemacht. Wenn Sie "Börsen und Warteschlangen" aus der Liste auswählen, können Sie sowohl Warteschlangen als auch Börsen problemlos löschen. Ich wünschte, dies könnte die akzeptierte Antwort sein.
Wiktor Zychla

Sehr saubere Lösung, ohne die Instanz SSH herumspielen zu müssen.
acidburn23

Schade, dass niemand erklärt, wie man das Management-Plugin und die Richtlinien installiert
gelonida

@ MesutA. Vielen Dank. Ich finde es gut, diesen Link in diesem Artikel zu haben. Es könnte sogar noch besser sein, es der Antwort hinzuzufügen, da Kommentare möglicherweise gelöscht werden. Aber ich habe jetzt zumindest diese Info
Gelonida

19

Versuche dies:

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

2
Dies hat bei mir funktioniert, aber auch gezeigt, *** Not found: /api/queues/%2F/nameweil die Ausgabe eine ASCII-Tabelle mit einer Spalte "Name" ist. Ich habe den Befehl so angepasst, dass rabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qner behoben wird.
Mark Edington

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

9

Wenn Sie rabbitmqadmin nicht installiert haben, versuchen Sie, Warteschlangen mit rabbitmqctl zu löschen:

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


Es gibt keine delete_queuenoch purge_queueBefehle in rabbitmqctl. Ich möchte viele Warteschlangen rabbitmqadmin
löschen

rabbitmqctl purge_queuearbeitete hier manuell. Ich musste nur -p <virtual-host> hinzufügen
Roman Susi

Im Gegensatz zu dem, was @Rolice oben angegeben hat, sind beide delete_queueund purge_queuein verfügbar rabbitmqctlund ich habe sie gerade erfolgreich ausgeführt. Vielleicht bist du auf einer alten Version.
Richard Dunn

Gut zu hören, dass diese kürzlich hinzugefügt worden sein könnten.
Rolice

6

Ich habe eine deleteRabbitMqQs.sh erstellt, die Argumente zum Durchsuchen der Warteschlangenliste akzeptiert und nur diejenigen auswählt, die dem gewünschten Muster entsprechen. Wenn Sie keine Argumente angeben, werden alle gelöscht! Es zeigt Ihnen die Liste der Warteschlangen, die gelöscht werden sollen, und lässt Sie beenden, bevor Sie etwas Destruktives tun.

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"

Wenn Sie eine andere Übereinstimmung mit den übergebenen Argumenten wünschen, können Sie den grep in Zeile vier ändern. Beim Löschen aller Warteschlangen werden keine mit drei aufeinander folgenden Leerzeichen gelöscht, da ich davon ausgegangen bin, dass Eventualitäten seltener sind als bei Personen, bei denen rabbitmqctl die Ausgabe in verschiedenen Sprachen druckt.

Genießen!


6

Wenn Sie versuchen, Warteschlangen zu löschen, weil sie nicht verwendet werden und nicht zurückgesetzt werden sollen, können Sie die TTL der Warteschlange über eine Richtlinie sehr niedrig einstellen und warten, bis die Warteschlangen automatisch gelöscht werden, sobald die TTL übergeben wurde und entfernen Sie dann die Richtlinie ( https://www.rabbitmq.com/ttl.html ).

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

So entfernen Sie die Richtlinie

rabbitmqctl clear_policy delq

Beachten Sie, dass dies nur für nicht verwendete funktioniert Warteschlangen

Originalinformationen hier: http://rabbitmq.1065348.n5.nabble.com/Deleting-all-queues-in-rabbitmq-td30933.html


6

In Rabbit Version 3.7.10 können Sie den folgenden Befehl mit Root-Berechtigung ausführen:

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

5

Hier ist eine Möglichkeit, dies mit PowerShell zu tun. Die URL muss möglicherweise aktualisiert werden

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

Beachten Sie, dass dadurch nur nicht leere Warteschlangen gelöscht werden. Entfernen Sie die -gt-Klausel, um alle Warteschlangen zu löschen
Peter Goodman

4

Sie können rabbitmqctl eval wie folgt verwenden:

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

Mit dem obigen Befehl werden alle leeren Warteschlangen in allen vhosts gelöscht, deren Name mit "Präfix-" beginnt. Sie können die Variablen IfUnused, IfEmpty und MatchRegex gemäß Ihren Anforderungen bearbeiten.


Perfekt, wenn rabbitmqadminnicht zugänglich ist.
NuSkooler

Ich fand das viel schneller als list_queues
TerrenceSun

3

Entfernen aller Warteschlangen mit rabbitmqctl one liner

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

2

Falls Sie nur die Warteschlangen löschen möchten, die nicht leer sind (viel schneller):

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

Für mich dauert das Löschen einer Warteschlange (sowohl leere als auch nicht leere) 2-3 Sekunden. Das Durchlaufen von 50 Warteschlangen ist also ein Problem, während ich nur 10 davon löschen muss (40/50 sind leer).


2

Ich habe rabbitmqctl ausprobiert und Befehle zurückgesetzt, aber sie sind sehr langsam.

Dies ist der schnellste Weg, den ich gefunden habe (ersetzen Sie Ihren Benutzernamen und Ihr Passwort):

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

Hinweis: Dies funktioniert nur mit dem Standard-vhost /


2

Um Warteschlangen aufzulisten,

./rabbitmqadmin -f tsv -q list queues

So löschen Sie eine Warteschlange:

./rabbitmqadmin delete queue name=name_of_queue

1

Hier ist eine schnellere Version (mit parallelinstall sudo apt-get install parallel), die die hervorragende Antwort von @admenva erweitert

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

Dieser Befehl löscht alle Ihre Warteschlangen

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

Dieses Skript ist sehr einfach, da es verwendet -f bashund die Warteschlangen als Liste ausgibt.

Dann xargs -n1teilen wir das in mehrere Variablen auf

Dann verwenden wir das xargs -I{}, um den folgenden Befehl auszuführen und {}im Befehl zu ersetzen .


Ich habe 10 verschiedene Antworten ausprobiert, und dies ist das EINZIGE, was tatsächlich dazu beigetragen hat, Warteschlangen zu löschen, ohne alle meine anderen Einstellungen zu löschen. Vielen Dank! Ich kann nicht glauben, dass rabbitmqctl nicht nur den Befehl "Alle Warteschlangen löschen" hat.
sudo

Übrigens, um rabbitmqadmin zu bekommen, müssen Sie http://yourhost:15672/cli/es herunterladen.
Sudo

1

Sie müssen den rabbitmq-Server nicht zurücksetzen, um nicht dauerhafte Warteschlangen zu löschen . Stoppen Sie einfach den Server und starten Sie ihn erneut. Dadurch werden alle nicht dauerhaften Warteschlangen entfernt.


einschließlich dauerhafter Warteschlangen? Das glaube ich nicht. Ich werde Ihre Antwort qualifizieren.
Hendy Irawan

Nein, dauerhafte Warteschlangen können nicht durch Stoppen des Servers gelöscht werden. Sie können unter den Warteschlangen von der RabbitMQ Management-Weboberfläche gelöscht werden.
ErAcube

Eigentlich ja, das hat mir geholfen und alle rund 4500 automatisch generierten Warteschlangen sind weg. Es scheint, dass dies nicht dauerhafte waren. Vielen Dank!
Rolice

1

Für diejenigen, die ein Problem mit der Installation von rabbitmqadmin haben, sollten Sie zuerst Python installieren.

Benutzer eines UNIX-ähnlichen Betriebssystems müssen rabbitmqadmin in ein Verzeichnis in PATH kopieren, z. B. / usr / local / bin.

Windows-Benutzer müssen sicherstellen, dass Python in ihrem Pfad angegeben ist, und rabbitmqadmin als python.exe rabbitmqadmin aufrufen.

Dann

  1. Navigieren Sie zu http://{hostname}:15672/cli/rabbitmqadminZum Herunterladen .
  2. Wechseln Sie in den enthaltenen Ordner und führen Sie cmd mit Administratorrechten aus

Warteschlangen auflisten python rabbitmqadmin list queues .

Warteschlange löschen python rabbitmqadmin delete queue name=Name_of_queue

Alle Warteschlangen löschen

1- Richtlinie deklarieren

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

2- Entfernen Sie die Richtlinie

python rabbitmqadmin  delete policy name='expire_all_policies'

0

Es gibt eine Möglichkeit, alle Warteschlangen und Austausche ohne Skripte und vollständiges Zurücksetzen zu entfernen. Sie können einen virtuellen Host einfach über die Administrationsoberfläche löschen und neu erstellen. Dies funktioniert auch für vhost /.

Sie müssen lediglich die Berechtigungen für den neu erstellten vhost wiederherstellen.


0

Okay, wichtiges Qualifikationsmerkmal für diese Antwort: Die Frage verlangt, entweder rabbitmqctl ODER rabbitmqadmin zu verwenden, um dies zu lösen. Meine Antwort musste beide verwenden. Beachten Sie außerdem, dass dies unter MacOS 10.12.6 und den Versionen von rabbitmqctl und rabbitmqadmin getestet wurde , die bei der Installation von rabbitmq mit Homebrew installiert werden und brew list --versionsals rabbitmq 3.7.0 gekennzeichnet sind

rabbitmqctl list_queues -p <VIRTUAL_HOSTNAME> name | sed 1,2d | xargs -I qname rabbitmqadmin --vhost <VIRTUAL_HOSTNAME> delete queue name=qname


0

Eine andere Möglichkeit besteht darin, den den Warteschlangen zugeordneten vhost zu löschen. Dadurch wird alles gelöscht, was mit dem vhost verbunden ist. Seien Sie also gewarnt, aber es ist einfach und schnell.


HINWEIS: Das RabbitMQ-Team überwacht die rabbitmq-usersMailingliste und beantwortet nur manchmal Fragen zu StackOverflow.


0

Ich habe die oben genannten Codeteile ausprobiert, aber kein Streaming durchgeführt.

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

Ich generiere eine Datei, die alle Warteschlangennamen enthält und diese zeilenweise durchläuft, um sie zu löschen. Für die Schleifen while read ...habe ich es nicht getan. Es wurde immer beim ersten Warteschlangennamen angehalten.


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

1
Ich erhalte dies, wenn ich es ausführe: head: illegal line line count - -1
Robert Ross

Der "Kopf -n-1" sollte entweder "Kopf -1" oder "Kopf -n 1" sein
Gerd Busker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.