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ć.

Odpowiedzi:


121

Rabbitmqadmin jest do tego idealnym narzędziem

rabbitmqadmin purge queue name=name_of_the_queue_to_be_purged

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

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

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

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)


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

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)

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

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