Как удалить все сообщения из одной очереди, используя CLI?

143

Как удалить все сообщения из одной очереди, используя cli? У меня есть имя очереди, и я хочу его почистить.

Бик
источник

Ответы:

121

rabbitmqadmin - идеальный инструмент для этого

rabbitmqadmin purge queue name=name_of_the_queue_to_be_purged
pr4n
источник
5
Мне было трудно найти инструмент в моей установке rabbitmq. Я наконец загрузил его отсюда: hg.rabbitmq.com/rabbitmq-management/raw-file/rabbitmq_v3_3_5/…
FactualHarmony
5
Если у вас уже установлен плагин управления, вы можете загрузить его сhttp://rabbitserver:15672/cli/
morloch
141

вы можете напрямую запустить эту команду

sudo rabbitmqctl purge_queue queue_name
Анураг джайн
источник
15
или, если у вас есть виртуальный хост, сделайтеrabbitmqctl purge_queue queue_name -p my_virt_host
коза
4
запустите sudo rabbitmqctl -h и проверьте список cammand, указанный вашим текущим rabbitmq. если его там нет, это означает, что текущая версия rabbitmq не поддерживает эту функцию.
Анураг Джайн
Это не сработало для меня - как только мой потребитель загорелся, очередь все еще была полна задач.
Джейми Иванов
Это можно было бы реализовать в 3.5.4 или 3.6.0 на основе github.com/rabbitmq/rabbitmq-server/pull/215 и rabbitmq.com/changelog.html . Если у вас более старая версия, может помочь rabbitmqadmin согласно stackoverflow.com/a/18267342/272387 .
Richlv
1
... и проверяя в github.com/rabbitmq/rabbitmq-server/releases/tag/… , эта функция появилась в 3.5.4.
Richlv
16

Для очистки очереди вы можете использовать следующую команду (больше информации в API doc):

curl -i -u guest:guest -XDELETE http://localhost:15672/api/queues/vhost_name/queue_name/contents
Ольга
источник
Вид страшно, насколько хорошо это сработало. Есть ли какой-нибудь способ предотвратить непреднамеренное это? Например, конфигурация для производственных серверов, которая отключает эту функцию, чтобы предотвратить случайную потерю данных?
Исаия
Да, защита будет состоять в том, чтобы удалить пользователя «гость» с помощью команды «delete_user»
Ocean Airdrop
16

RabbitMQ реализует расширенный протокол очереди сообщений (AMQP), поэтому вы можете использовать универсальные инструменты для подобных вещей.

В Debian / Ubuntu или аналогичной системе выполните:

sudo apt-get install amqp-tools
amqp-delete-queue -q celery  # where celery is the name of the queue to delete
benjaoming
источник
Это хорошее решение, для некоторых версий нет rabbitmqadmin.
Вишоу
11
Это удаляет всю очередь, а не просто очищает ее. Таким образом, очередь больше не существует, и вы должны повторно инициализировать пустую очередь впоследствии.
кроб
13

RabbitMQ имеет 2 вещи в очереди

  1. Удалить
  2. чистка

Удалить - удалит очередь

Очистка - это очистит очередь (т.е. удаляет сообщения из очереди, но очередь все еще существует)

Гуру Прасад
источник
1
Это может показаться простым, но это был ответ, который мне был нужен.
Ник Пикеринг
8

ВАЖНОЕ ПРИМЕЧАНИЕ: это удалит всех пользователей и конфигурации.

Предупреждение !!

Предупреждение !!

Я не предлагаю этот ответ до тех пор, пока вы не захотите удалить данные из всех очередей, включая пользователей и конфиги. Просто сбросьте его !!!

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
Naren
источник
28
Это также сбрасывает ваших пользователей и другие настройки!
Codewithcheese
Я использовал это как часть модульных тестов. например, я очищаю все, затем настраиваю все программно через stackoverflow.com/questions/4545660/… затем заполняю некоторые сообщения и выполняю тестирование черного ящика, чтобы убедиться, что сообщения прошли. Отлично работает для этой цели. :)
Джеймс Оравец
3
Это действительно наивно. Это не приемлемо в качестве ответа на серьезный вопрос. Это уничтожит все данные сервера.
Андре Пасторе
2
обнуление хранилища и переустановка ОС также избавляет от данных; это не то, о чем спрашивает ОП
istepaniuk
5

Я думаю, что уже поздно, но для других, это можно сделать с помощью Пика

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
источник
1
Привет @ Prajnavantha это Пика имеет какой-либо метод только ясное сообщение? (не удалять очередь)
Джейд Хан
2

Я успешно использовал ampq-purgeиз amqp-utils для этого:

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
источник
2

Для удаления только сообщений из очереди используйте:

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

Чтобы удалить очередь, которая пуста ( --if-empty ) или не имеет потребителей ( --if-unused ), используйте:

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

или

sudo rabbitmqctl --node <nodename> delete_queue <queue_name> --if-unused 
Ашвани Сингх
источник