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.