Jak usunąć wszystkie wiadomości z pojedynczej kolejki przy użyciu interfejsu wiersza polecenia?

142

Jak usunąć wszystkie wiadomości z jednej kolejki za pomocą CLI? Mam nazwę kolejki i chcę ją wyczyścić.

Bick
źródło

Odpowiedzi:

121

Rabbitmqadmin jest do tego idealnym narzędziem

rabbitmqadmin purge queue name=name_of_the_queue_to_be_purged
pr4n
źródło
5
Trudno mi było znaleźć narzędzie w mojej instalacji rabbitmq. W końcu pobrałem
FactualHarmony
5
Jeśli masz już zainstalowaną wtyczkę do zarządzania, możesz ją pobrać zhttp://rabbitserver:15672/cli/
morloch,
140

możesz bezpośrednio uruchomić to polecenie

sudo rabbitmqctl purge_queue queue_name
Anurag jain
źródło
15
lub, jeśli masz wirtualnego hosta, zrób torabbitmqctl purge_queue queue_name -p my_virt_host
goat
4
uruchom sudo rabbitmqctl -h i sprawdź listę camm na liście twojego aktualnego rabbitmq. jeśli go tam nie ma, oznacza to, że aktualna wersja rabbitmq nie obsługuje tej funkcji.
Anurag jain
To nie zadziałało - jak tylko mój konsument odpalił, kolejka wciąż była pełna zadań.
Jamie Ivanov
Mogło to zostać zaimplementowane w 3.5.4 lub 3.6.0, na podstawie github.com/rabbitmq/rabbitmq-server/pull/215 i rabbitmq.com/changelog.html . Jeśli masz starszą wersję, może pomóc rabbitmqadmin zgodnie ze stackoverflow.com/a/18267342/272387 .
Richlv,
1
... i sprawdzając na github.com/rabbitmq/rabbitmq-server/releases/tag/ ... ta funkcja pojawiła się w 3.5.4.
Richlv
16

Aby wyczyścić kolejkę, możesz użyć następującego polecenia (więcej informacji w dokumentacji API):

curl -i -u guest:guest -XDELETE http://localhost:15672/api/queues/vhost_name/queue_name/contents
Olga
źródło
Trochę przerażające, jak dobrze to działało. Jakiś sposób, aby się przed tym nieumyślnie uchronić? Na przykład konfiguracja dla serwerów produkcyjnych, która wyłącza tę funkcję, aby zapobiec przypadkowej utracie danych?
Izajasz
Tak, ochrona polegałaby na usunięciu użytkownika „guest” za pomocą polecenia „delete_user”
Ocean Airdrop
16

RabbitMQ implementuje protokół Advanced Message Queuing Protocol (AMQP), dzięki czemu można używać ogólnych narzędzi do takich rzeczy.

W systemie Debian / Ubuntu lub podobnym wykonaj:

sudo apt-get install amqp-tools
amqp-delete-queue -q celery  # where celery is the name of the queue to delete
benjaoming
źródło
To dobre rozwiązanie dla niektórych wersji, które nie mają rabbitmqadmin.
WisZhou
11
Spowoduje to usunięcie całej kolejki, a nie tylko jej wyczyszczenie. Tak więc kolejka już nie istnieje i musisz później ponownie zainicjować pustą kolejkę.
krob
13

RabbitMQ ma 2 rzeczy w kolejce

  1. Usunąć
  2. Oczyścić

Usuń - usuwa kolejkę

Wyczyść - spowoduje to opróżnienie kolejki (co oznacza usunięcie wiadomości z kolejki, ale kolejka nadal istnieje)

Guru Prasad
źródło
1
Może się to wydawać proste, ale to była odpowiedź, której potrzebowałem.
Nicholas Pickering
8

WAŻNA UWAGA: spowoduje to usunięcie wszystkich użytkowników i config.

ALARM !!

ALARM !!

Nie sugeruję tej odpowiedzi, chyba że chcesz usunąć dane ze wszystkich kolejek, w tym użytkowników i konfiguracji. Po prostu zresetuj !!!

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
naren
źródło
28
To również resetuje twoich użytkowników i inne konfiguracje!
Codewithcheese
Użyłem tego w ramach testów jednostkowych. np. wyczyszczę wszystko, a następnie ustawiam to wszystko programowo przez stackoverflow.com/questions/4545660/ ... następnie wypełniam kilka wiadomości i wykonuję testy czarnoskrzynkowe, aby upewnić się, że wiadomości przeszły. Świetnie sprawdza się w tym celu. :)
James Oravec
3
To jest naprawdę naiwne. Nie do przyjęcia jest odpowiedź na poważne pytanie. Zniszczy wszystkie dane serwera.
Andre Pastore
2
wyzerowanie pamięci i ponowna instalacja systemu operacyjnego również usuwa dane; nie o to prosi OP
istepaniuk
5

Myślę, że jest późno, ale dla innych odniesień można to zrobić za pomocą pika

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)
prajnavantha
źródło
1
cześć @prajnavantha czy pika ma jakąś metodę, tylko jasne przesłanie? (nie usuwaj kolejki)
Jade Han
2

Z powodzeniem użyłem ampq-purgez amqp-utils, aby to zrobić:

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
andrewdotn
źródło
2

Aby usunąć tylko wiadomości z kolejki, użyj:

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

Aby usunąć kolejkę, która jest pusta ( --if-empty ) lub nie ma konsumentów ( --if-unused ), użyj:

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

lub

sudo rabbitmqctl --node <nodename> delete_queue <queue_name> --if-unused 
Ashwani Singh
źródło