Antworten:
Wenn Sie sich nicht für die Daten in der Verwaltungsdatenbank interessieren; dh users
, vhosts
, messages
usw., und weder über andere queues
, dann können Sie reset
über Kommandozeile , indem Sie die folgenden Befehle in fahrbereitem Zustand:
WARNUNG: Zusätzlich zu den Warteschlangen, werden diese auch entfernen jede
users
undvhosts
Sie auf Ihrem RabbitMQ Server konfiguriert haben; und löscht alle persistentenmessages
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
Die rabbitmq-Dokumentation besagt, dass der reset
Befehl:
Bringt einen RabbitMQ-Knoten in seinen ursprünglichen Zustand zurück.
Entfernt den Knoten aus jedem Cluster, zu dem er gehört, entfernt alle Daten aus der Verwaltungsdatenbank, z. B. konfigurierte Benutzer und vhosts, und löscht alle persistenten Nachrichten.
Seien Sie also vorsichtig damit.
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))
channel = connection.channel()
channel.queue_delete(queue='queue-name')
connection.close()
Installieren Sie das Pika-Paket wie folgt
$ sudo pip install pika==0.9.8
Die Installation hängt von Pip- und Git-Core-Paketen ab. Möglicherweise müssen Sie diese zuerst installieren.
Unter Ubuntu:
$ sudo apt-get install python-pip git-core
Auf Debian:
$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip
Unter Windows: Um easy_install zu installieren, führen Sie das MS Windows Installer für setuptools aus
> easy_install pip
> pip install pika==0.9.8
In RabbitMQ-Versionen> 3.0 können Sie die HTTP-API auch verwenden, wenn das Plugin rabbitmq_management aktiviert ist. Stellen Sie einfach sicher, dass der Inhaltstyp auf 'application / json' gesetzt ist, und geben Sie den vhost- und den Warteschlangennamen an:
IE Verwenden von Curl mit einem vhost 'test' und dem Warteschlangennamen 'testqueue':
$ curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/test/testqueue
HTTP/1.1 204 No Content
Server: MochiWeb/1.1 WebMachine/1.9.0 (someone had painted it blue)
Date: Tue, 16 Apr 2013 10:37:48 GMT
Content-Type: application/json
Content-Length: 0
administrator
Stellen Sie sicher, dass Ihr Benutzer mit einem Tag versehen ist, da er sonst bestimmte Teile der API nicht verwenden kann.
$ curl -i -u 'user:pass' -H "content-type:application/json" -XDELETE 'http://localhost:15672/api/queues/vhostname/name.portal' HTTP/1.1 204 No Content Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact) Date: Wed, 30 Jul 2014 11:23:47 GMT Content-Type: application/json Content-Length: 0
Es gibt rabbitmqadmin, das schön ist, von der Konsole aus zu arbeiten.
Wenn Sie sich bei einem Server anmelden, auf dem Rabbit installiert ist, können Sie es herunterladen von:
http://{server}:15672/cli/rabbitmqadmin
und speichern Sie es in / usr / local / bin / rabbitmqadmin
Dann kannst du rennen
rabbitmqadmin -u {user} -p {password} -V {vhost} delete queue name={name}
Normalerweise erfordert es Sudo.
Wenn Sie die Eingabe Ihres Benutzernamens und Kennworts vermeiden möchten, können Sie config verwenden
rabbitmqadmin -c /var/lib/rabbitmq/.rabbitmqadmin.conf -V {vhost} delete queue name={name}
All dies unter der Annahme, dass Sie die Datei ** /var/lib/rabbitmq/.rabbitmqadmin.conf** haben und nur ein Minimum haben
hostname = localhost
port = 15672
username = {user}
password = {password}
BEARBEITEN: Ab dem Kommentar von @ user299709 kann es hilfreich sein, darauf hinzuweisen, dass der Benutzer in Kaninchen als "Administrator" gekennzeichnet sein muss. ( https://www.rabbitmq.com/management.html )
Sie stellen sicher, dass eine Warteschlange vorhanden ist (und erstellen sie, wenn dies nicht der Fall ist), indem Sie queue.declare verwenden . Wenn Sie das automatische Löschen ursprünglich auf false gesetzt haben, führt ein erneuter Aufruf von queue.declare mit autodelete true zu einem weichen Fehler und der Broker schließt den Kanal.
Sie müssen jetzt queue.delete verwenden, um es zu löschen.
Weitere Informationen finden Sie in der API-Dokumentation:
Wenn Sie einen anderen Client verwenden, müssen Sie die entsprechende Methode finden. Da es Teil des Protokolls ist, sollte es dort sein, und es ist wahrscheinlich Teil von Channel oder einem gleichwertigen.
Vielleicht möchten Sie auch einen Blick auf den Rest der Dokumentation werfen , insbesondere auf den Abschnitt " Erste Schritte" , in dem viele häufig verwendete Anwendungsfälle behandelt werden.
Wenn Sie eine Frage haben und die Antwort an keiner anderen Stelle finden, sollten Sie versuchen, sie auf der RabbitMQ Discuss- Mailingliste zu veröffentlichen. Die Entwickler geben ihr Bestes, um alle dort gestellten Fragen zu beantworten.
Eine kurze Zusammenfassung zum schnellen Löschen der Warteschlange mit allen Standardwerten vom Host, auf dem der RMQ-Server ausgeführt wird:
curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName
So löschen Sie alle Warteschlangen, die einem Muster in einem bestimmten vhost entsprechen (z. B. 'amq.gen' im root-vhost):
rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%
Eine andere Möglichkeit wäre, das management_plugin zu aktivieren und über einen Browser eine Verbindung zu ihm herzustellen. Sie können alle Warteschlangen und Informationen dazu anzeigen. Es ist möglich und einfach, Warteschlangen von dieser Schnittstelle zu löschen.
Ich habe die JavaScript / jQuery-Methode von Piotr Stapp etwas weiter verallgemeinert, sie in eine Funktion eingekapselt und ein wenig verallgemeinert.
Diese Funktion verwendet die RabbitMQ-HTTP-API, um verfügbare Warteschlangen in einem bestimmten Bereich abzufragen vhost
und sie dann basierend auf einer Option zu löschen queuePrefix
:
function deleteQueues(vhost, queuePrefix) {
if (vhost === '/') vhost = '%2F'; // html encode forward slashes
$.ajax({
url: '/api/queues/'+vhost,
success: function(result) {
$.each(result, function(i, queue) {
if (queuePrefix && !queue.name.startsWith(queuePrefix)) return true;
$.ajax({
url: '/api/queues/'+vhost+'/'+queue.name,
type: 'DELETE',
success: function(result) { console.log('deleted '+ queue.name)}
});
});
}
});
};
Sobald Sie diese Funktion in die JavaScript-Konsole Ihres Browsers eingefügt haben, während Sie sich auf Ihrer RabbitMQ-Verwaltungsseite befinden, können Sie sie folgendermaßen verwenden:
Löschen Sie alle Warteschlangen in '/' vhost
deleteQueues('/');
Löschen Sie alle Warteschlangen in '/' vhost, beginnend mit 'test'.
deleteQueues('/', 'test');
Löschen Sie alle Warteschlangen in 'dev' vhost, beginnend mit 'foo'.
deleteQueues('dev', 'foo');
Bitte benutzen Sie dies auf eigenes Risiko!
Das Management Plugin (Webinterface) gibt Ihnen einen Link zu einem Python-Skript. Sie können damit Warteschlangen löschen. Ich habe dieses Muster verwendet, um viele Warteschlangen zu entfernen:
python tmp/rabbitmqadmin --vhost=... --username=... --password=... list queues > tmp/q
vi tmp/q # remove all queues which you want to keep
cut -d' ' -f4 tmp/q| while read q;
do python tmp/rabbitmqadmin --vhost=... --username=... --password=... delete queue name=$q;
done
Ich benutze diesen Alias in .profile
:
alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py"
Wo qclean.py
hat der folgende Code:
import sys
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
queues = sys.stdin.readlines()[1:-1]
for x in queues:
q = x.split()[0]
print 'Deleting %s...' %(q)
channel.queue_delete(queue=q)
connection.close()
Im Wesentlichen ist dies eine iterative Version des Codes von Shweta B. Patil.
Installieren
$ sudo rabbitmq-plugins enable rabbitmq_management
und gehen Sie zu http: // localhost: 15672 / # / queues, wenn Sie localhost verwenden. das Standardkennwort wird username: guest
, password: guest
und auf Warteschlangen Registerkarte gehen und die Warteschlange löschen.
Hoffentlich könnte es jemandem helfen.
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 hörte immer beim ersten Warteschlangennamen auf.
Wenn Sie eine einzelne Warteschlange löschen möchten, helfen die oben genannten Lösungen (Python, Java ...) und auch do sudo rabbitmqctl delete_queue queue_name
. Ich benutze rabbitmqctl
statt rabbitmqadmin
.
Wenn das Plugin rabbitmq_management installiert ist, können Sie dies ausführen, um alle unerwünschten Warteschlangen zu löschen:
rabbitmqctl list_queues -p vhost_name |\
grep -v "fast\|medium\|slow" |\
tr "[:blank:]" " " |\
cut -d " " -f 1 |\
xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost_name>/{}
Lassen Sie uns den Befehl aufschlüsseln:
rabbitmqctl list_queues -p vhost_name
listet alle Warteschlangen auf und wie viele Aufgaben sie aktuell haben.
grep -v "fast\|medium\|slow"
filtert die Warteschlangen, die Sie nicht löschen möchten. Nehmen wir an, wir möchten jede Warteschlange ohne die Wörter schnell , mittel oder langsam löschen .
tr "[:blank:]" " "
normalisiert das Trennzeichen in rabbitmqctl zwischen dem Namen der Warteschlange und der Anzahl der vorhandenen Aufgaben
cut -d " " -f 1
wird sich teilen , jede Zeile durch das Leerzeichen und der 1. Spalte (die Warteschlangenname) Wählen
xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}
nimmt den Namen der Warteschlange auf und setzt ihn dort ein, wo wir ihn eingestellt haben {}
Zeichen alle Warteschlangen löscht, die dabei nicht gefiltert werden.
Stellen Sie sicher, dass der verwendete Benutzer über Administratorrechte verfügt.
Ich habe es anders gemacht, weil ich nur Zugriff auf die Management-Webseite hatte. Ich habe ein einfaches "Snippet" erstellt, das Warteschlangen in Javascript löscht. Hier ist es:
function zeroPad(num, places) {
var zero = places - num.toString().length + 1;
return Array(+(zero > 0 && zero)).join("0") + num;
}
var queuePrefix = "PREFIX"
for(var i=0; i<255; i++){
var queueid = zeroPad(i, 4);
$.ajax({url: '/api/queues/vhost/'+queuePrefix+queueid, type: 'DELETE', success: function(result) {console.log('deleted '+queuePrefix+queueid)}});
}
Alle meine Warteschlangen hatten das Format: PREFIX_0001 bis PREFIX_0XXX