Como excluo todas as mensagens de uma única fila usando a CLI?

142

Como faço para excluir todas as mensagens de uma única fila usando o cli? Eu tenho o nome da fila e quero limpá-lo.

Bick
fonte

Respostas:

121

rabbitmqadmin é a ferramenta perfeita para isso

rabbitmqadmin purge queue name=name_of_the_queue_to_be_purged
pr4n
fonte
5
Foi difícil encontrar a ferramenta na instalação do rabbitmq. Finalmente, baixei-o aqui: hg.rabbitmq.com/rabbitmq-management/raw-file/rabbitmq_v3_3_5/…
FactualHarmony
5
Se você tiver a gestão plug-in já instalado, você pode transferi-lo a partir dehttp://rabbitserver:15672/cli/
Morloch
140

você pode executar diretamente este comando

sudo rabbitmqctl purge_queue queue_name
Anurag jain
fonte
15
ou, se você tem um host virtual, façarabbitmqctl purge_queue queue_name -p my_virt_host
cabra
4
execute sudo rabbitmqctl -h e verifique a lista de cammands listados pelo seu rabbitmq atual. se não estiver lá, significa que a versão atual do rabbitmq não suporta esse recurso.
Anurag jain
Isso não funcionou para mim - assim que meu consumidor foi acionado, a fila ainda estava cheia de tarefas.
21717 Jamie Ivanov
Isso poderia ter sido implementado no 3.5.4 ou 3.6.0, com base em github.com/rabbitmq/rabbitmq-server/pull/215 e rabbitmq.com/changelog.html . Se você possui uma versão mais antiga, o rabbitmqadmin conforme stackoverflow.com/a/18267342/272387 pode ajudar.
Richlv
1
... e, em github.com/rabbitmq/rabbitmq-server/releases/tag/… , esse recurso apareceu no 3.5.4.
Richlv 26/10
16

Para limpar a fila, você pode usar o seguinte comando (mais informações no documento da API):

curl -i -u guest:guest -XDELETE http://localhost:15672/api/queues/vhost_name/queue_name/contents
Olga
fonte
Meio assustador o quão bem isso funcionou. Alguma maneira de se proteger contra isso acontecer sem querer? Como uma configuração para servidores de produção que desativa essa funcionalidade para evitar perda acidental de dados?
Isaiah
Sim, a proteção seria excluir o usuário "guest" usando o comando "delete_user"
Ocean Airdrop
16

O RabbitMQ implementa o AMQP (Advanced Message Queuing Protocol) para que você possa usar ferramentas genéricas para coisas como esta.

No Debian / Ubuntu ou sistema similar, faça:

sudo apt-get install amqp-tools
amqp-delete-queue -q celery  # where celery is the name of the queue to delete
benjaoming
fonte
Essa é uma boa solução para algumas versões não possuem rabbitmqadmin.
23416 WisZhou
11
Isso exclui toda a fila, não apenas a limpa. Portanto, a fila não existe mais e você precisa reinicializar a fila vazia posteriormente.
krob
13

RabbitMQ tem 2 coisas na fila

  1. Excluir
  2. Purga

Excluir - excluirá a fila

Limpar - Isso esvaziará a fila (ou seja, remove as mensagens da fila, mas a fila ainda existe)

Guru Prasad
fonte
1
Pode parecer simples, mas esta era a resposta que eu precisava.
Nick Pickering
8

NOTA IMPORTANTE: Isso excluirá todos os usuários e configurações.

ALERTA !!

ALERTA !!

Eu não sugiro essa resposta até que você queira excluir dados de todas as filas, incluindo usuários e configurações. Apenas redefini-lo !!!

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
naren
fonte
28
Isso também redefine seus usuários e outras configurações!
Codewithcheese 27/02
Eu usei isso como parte de testes de unidade. por exemplo, eu limpo tudo, depois configuro tudo programaticamente via stackoverflow.com/questions/4545660/… , preenche algumas mensagens e faço testes de caixa preta para garantir que as mensagens sejam transmitidas. Funciona muito bem para esse fim. :)
James Oravec
3
É realmente ingênuo. Não é aceitável como resposta a uma pergunta séria. Isso destruirá todos os dados do servidor.
Andre Pastore
2
zerar seu armazenamento e reinstalar o sistema operacional também se livra dos dados; este não é o OP está pedindo
istepaniuk
5

Eu acho que é tarde, mas para outras referências, isso pode ser feito com 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
fonte
1
oi @prajnavantha is pika tem algum método apenas mensagem clara? (não excluir fila)
Jade Han
2

Eu usei com sucesso ampq-purgedo amqp-utils para fazer isso:

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
fonte
2

Para excluir apenas as mensagens da fila, use:

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

Para excluir uma fila vazia ( --if-vazia ) ou sem consumidores ( --if-não utilizada ), use:

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

ou

sudo rabbitmqctl --node <nodename> delete_queue <queue_name> --if-unused 
Ashwani Singh
fonte