Wie lösche ich alle Nachrichten mithilfe der CLI aus einer einzelnen Warteschlange?


142

Wie lösche ich alle Nachrichten mit der CLI aus einer einzelnen Warteschlange? Ich habe den Namen der Warteschlange und möchte ihn bereinigen.

Antworten:



140

Sie können diesen Befehl direkt ausführen

sudo rabbitmqctl purge_queue queue_name

15
oder, wenn Sie einen virtuellen Host haben, tunrabbitmqctl purge_queue queue_name -p my_virt_host
Ziege

4
Führen Sie sudo rabbitmqctl -h aus und überprüfen Sie die Liste der von Ihrem aktuellen rabbitmq aufgelisteten cammand. Wenn es nicht vorhanden ist, bedeutet dies, dass die aktuelle Version von rabbitmq diese Funktion nicht unterstützt.
Anurag Jain

Dies funktionierte bei mir nicht - sobald mein Verbraucher sich meldete, war die Warteschlange immer noch voller Aufgaben.
Jamie Ivanov

Dies könnte entweder in 3.5.4 oder 3.6.0 implementiert worden sein, basierend auf github.com/rabbitmq/rabbitmq-server/pull/215 und rabbitmq.com/changelog.html . Wenn Sie eine ältere Version haben, kann rabbitmqadmin gemäß stackoverflow.com/a/18267342/272387 hilfreich sein.
Richlv

1
... und beim Einchecken in github.com/rabbitmq/rabbitmq-server/releases/tag/… wurde diese Funktion in 3.5.4 angezeigt.
Richlv

16

Zum Löschen der Warteschlange können Sie den folgenden Befehl verwenden (weitere Informationen im API-Dokument):

curl -i -u guest:guest -XDELETE http://localhost:15672/api/queues/vhost_name/queue_name/contents

Ein bisschen beängstigend, wie gut das funktioniert hat. Gibt es eine Möglichkeit, sich davor zu schützen, dass dies ungewollt geschieht? Zum Beispiel eine Konfiguration für Produktionsserver, die diese Funktionalität deaktiviert, um versehentlichen Datenverlust zu verhindern?
Jesaja

Ja, der Schutz wäre, den Benutzer "guest" mit dem Befehl "delete_user" zu löschen
Ocean Airdrop

16

RabbitMQ implementiert das Advanced Message Queuing Protocol (AMQP), sodass Sie für solche Dinge generische Tools verwenden können.

Führen Sie auf Debian / Ubuntu oder einem ähnlichen System Folgendes aus:

sudo apt-get install amqp-tools
amqp-delete-queue -q celery  # where celery is the name of the queue to delete

Das ist eine gute Lösung für einige Versionen, die kein rabbitmqadmin haben.
WisZhou

11
Dadurch wird die gesamte Warteschlange gelöscht und nicht nur gelöscht. Die Warteschlange existiert also nicht mehr und Sie müssen die leere Warteschlange anschließend neu initialisieren.
Krob

13

RabbitMQ hat 2 Dinge in der Warteschlange

  1. Löschen
  2. Spülen

Löschen - löscht die Warteschlange

Bereinigen - Hiermit wird die Warteschlange geleert (dh Nachrichten werden aus der Warteschlange entfernt, aber die Warteschlange ist noch vorhanden).


1
Es mag einfach erscheinen, aber das war die Antwort, die ich brauchte.
Nicholas Pickering

8

WICHTIGER HINWEIS: Dadurch werden alle Benutzer und Konfigurationen gelöscht.

ALERT !!

ALERT !!

Ich schlage diese Antwort erst vor, wenn Sie Daten aus allen Warteschlangen löschen möchten, einschließlich Benutzer und Konfigurationen. Einfach zurücksetzen !!!

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

28
Das setzt auch Ihre Benutzer und andere Konfigurationen zurück!
Codewithcheese

Ich habe dies als Teil von Unit-Tests verwendet. Beispiel: Ich lösche alles, richte alles programmgesteuert über stackoverflow.com/questions/4545660/… ein, fülle dann einige Nachrichten aus und führe Black-Box-Tests durch, um sicherzustellen, dass Nachrichten durchlaufen wurden. Funktioniert hervorragend für diesen Zweck. :)
James Oravec

3
Es ist wirklich naiv. Es ist nicht akzeptabel als Antwort auf eine ernste Frage. Es werden alle Serverdaten zerstört.
Andre Pastore

2
Wenn Sie Ihren Speicher auf Null setzen und das Betriebssystem neu installieren, werden auch die Daten entfernt. Dies ist nicht, was OP fragt
istepaniuk

5

Ich denke, es ist spät, aber für andere Referenz kann dies mit Pika gemacht werden

import pika
host_ip = #host ip
channel = pika.BlockingConnection(pika.ConnectionParameters(host_ip,
                                                        5672,
                                                        "/",
credentials=pika.PlainCredentials("username","pwd"))).channel()
print "deleting queue..", channel.queue_delete(queue=queue_name)

1
Hallo @prajnavantha ist Pika hat eine Methode nur klare Nachricht? (Warteschlange nicht löschen)
Jade Han

2

Ich habe erfolgreich ampq-purgevon amqp-utils verwendet , um dies zu tun:

git clone https://github.com/dougbarth/amqp-utils.git
cd amqp-utils
# extracted from Rakefile
echo "source 'https://rubygems.org'
gem 'amqp', '~> 0.7.1'
gem 'trollop', '~> 1.16.2'
gem 'facets', '~> 2.9'
gem 'clio', '~> 0.3.0'
gem 'json', '~> 1.5'
gem 'heredoc_unindent', '~> 1.1.2'
gem 'msgpack', '~> 0.4.5'" > Gemfile
bundle install --path=$PWD/gems
export RUBYLIB=.
export GEM_HOME=$PWD/gems/ruby/1.9.1

ruby bin/amqp-purge -v -V /vhost -u user -p queue
# paste password at prompt

2

Um nur Nachrichten aus der Warteschlange zu löschen, verwenden Sie:

sudo rabbitmqctl --node <nodename> purge_queue <queue_name>

Um eine Warteschlange zu löschen, die leer ist ( --if-leer ) oder keine Verbraucher hat ( --if-unbenutzt ), verwenden Sie:

sudo rabbitmqctl --node <nodename> delete_queue <queue_name> --if-empty

oder

sudo rabbitmqctl --node <nodename> delete_queue <queue_name> --if-unused 
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.