У меня есть несколько очередей с RabbitMQ. Некоторые из них сейчас бесполезны, как их удалить? К сожалению, я не выбрал auto_delete
опцию.
Если я установлю сейчас, он будет удален?
Есть ли способ удалить эти очереди сейчас?
Ответы:
Если вам не важны данные в базе данных управления; то есть users
, vhosts
и messages
т. д., и ни о чем другом queues
, то вы можете reset
через командную строку, выполнив следующие команды по порядку:
ВНИМАНИЕ: В дополнение к очередям, это также удалит все
users
иvhosts
, которые вы настроили на своем сервере RabbitMQ; и удалит все постоянныеmessages
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
В документации rabbitmq говорится, что reset
команда:
Возвращает узел RabbitMQ в исходное состояние.
Удаляет узел из любого кластера, к которому он принадлежит, удаляет все данные из базы данных управления, такие как настроенные пользователи и vhosts, и удаляет все постоянные сообщения.
Так что будьте осторожны при его использовании.
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))
channel = connection.channel()
channel.queue_delete(queue='queue-name')
connection.close()
Установите пакет pika следующим образом
$ sudo pip install pika==0.9.8
Установка зависит от пакетов pip и git-core, вам может потребоваться сначала установить их.
В Ubuntu:
$ sudo apt-get install python-pip git-core
В Debian:
$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip
В Windows: чтобы установить easy_install, запустите установщик MS Windows для инструментов установки.
> easy_install pip
> pip install pika==0.9.8
В версиях RabbitMQ> 3.0 вы также можете использовать HTTP API, если включен плагин rabbitmq_management. Просто не забудьте установить тип содержимого на 'application / json' и указать имя vhost и очереди:
IE Использование curl с vhost 'test' и именем очереди 'testqueue':
$ curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/test/testqueue
HTTP/1.1 204 No Content
Server: MochiWeb/1.1 WebMachine/1.9.0 (someone had painted it blue)
Date: Tue, 16 Apr 2013 10:37:48 GMT
Content-Type: application/json
Content-Length: 0
administrator
иначе он не сможет использовать определенные части API.
$ curl -i -u 'user:pass' -H "content-type:application/json" -XDELETE 'http://localhost:15672/api/queues/vhostname/name.portal' HTTP/1.1 204 No Content Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact) Date: Wed, 30 Jul 2014 11:23:47 GMT Content-Type: application/json Content-Length: 0
Однако очередь все еще остается :( - есть идеи?
Есть rabbitmqadmin, с которым приятно работать с консоли.
Если вы ssh / авторизуетесь на сервере, на котором установлен кролик, вы можете скачать его с:
http://{server}:15672/cli/rabbitmqadmin
и сохраните его в / usr / local / bin / rabbitmqadmin
Тогда ты можешь бежать
rabbitmqadmin -u {user} -p {password} -V {vhost} delete queue name={name}
Обычно для этого требуется sudo.
Если вы не хотите вводить свое имя пользователя и пароль, вы можете использовать config
rabbitmqadmin -c /var/lib/rabbitmq/.rabbitmqadmin.conf -V {vhost} delete queue name={name}
Все это в предположении, что у вас есть файл ** /var/lib/rabbitmq/.rabbitmqadmin.conf** и есть минимальный
hostname = localhost
port = 15672
username = {user}
password = {password}
РЕДАКТИРОВАТЬ: Что касается комментария от @ user299709, может быть полезно указать, что пользователь должен быть помечен как «администратор» в кролике. ( https://www.rabbitmq.com/management.html )
Краткое описание быстрого удаления очереди со всеми значениями по умолчанию с хоста, на котором запущен сервер RMQ:
curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName
Чтобы удалить все очереди, соответствующие шаблону в данном виртуальном хосте (например, содержащие 'amq.gen' в корневом виртуальном хосте):
rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%
Вы утверждаете, что очередь существует (и создаете ее, если ее нет), используя queue.declare . Если вы изначально установили для автоматического удаления значение false, повторный вызов queue.declare с autodelete true приведет к мягкой ошибке, и брокер закроет канал.
Теперь вам нужно использовать queue.delete , чтобы удалить его.
См. Подробную информацию в документации по API:
Если вы используете другой клиент, вам нужно будет найти эквивалентный метод. Поскольку он является частью протокола, он должен быть там и, вероятно, является частью Channel или его эквивалента.
Вы также можете ознакомиться с остальной документацией, в частности, с разделом «Начало работы », который охватывает множество распространенных вариантов использования.
Наконец, если у вас есть вопрос, и вы не можете найти ответ в другом месте, попробуйте опубликовать его в списке рассылки RabbitMQ Discuss . Разработчики стараются ответить на все вопросы, которые там задаются.
Другой вариант - включить management_plugin и подключиться к нему через браузер. Вы можете видеть все очереди и информацию о них. С помощью этого интерфейса можно и просто удалить очереди.
Я немного обобщил метод JavaScript / jQuery Петра Стаппа, инкапсулируя его в функцию и немного обобщая.
Эта функция использует RabbitMQ HTTP API для запроса доступных очередей в заданном vhost
и затем удаляет их на основании необязательного queuePrefix
:
function deleteQueues(vhost, queuePrefix) {
if (vhost === '/') vhost = '%2F'; // html encode forward slashes
$.ajax({
url: '/api/queues/'+vhost,
success: function(result) {
$.each(result, function(i, queue) {
if (queuePrefix && !queue.name.startsWith(queuePrefix)) return true;
$.ajax({
url: '/api/queues/'+vhost+'/'+queue.name,
type: 'DELETE',
success: function(result) { console.log('deleted '+ queue.name)}
});
});
}
});
};
Вставив эту функцию в консоль JavaScript вашего браузера, находясь на странице управления RabbitMQ, вы можете использовать ее следующим образом:
Удалить все очереди в хосте '/'
deleteQueues('/');
Удалить все очереди в '/' vhost, начинающиеся с 'test'
deleteQueues('/', 'test');
Удалить все очереди в виртуальном хосте 'dev', начинающиеся с 'foo'
deleteQueues('dev', 'foo');
Пожалуйста, используйте это на свой страх и риск!
Плагин управления (веб-интерфейс) дает вам ссылку на скрипт python. Вы можете использовать его для удаления очередей. Я использовал этот паттерн для удаления множества очередей:
python tmp/rabbitmqadmin --vhost=... --username=... --password=... list queues > tmp/q
vi tmp/q # remove all queues which you want to keep
cut -d' ' -f4 tmp/q| while read q;
do python tmp/rabbitmqadmin --vhost=... --username=... --password=... delete queue name=$q;
done
Я использую этот псевдоним в .profile
:
alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py"
где qclean.py
есть следующий код:
import sys
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
queues = sys.stdin.readlines()[1:-1]
for x in queues:
q = x.split()[0]
print 'Deleting %s...' %(q)
channel.queue_delete(queue=q)
connection.close()
По сути, это итерационная версия кода Свети Б. Патил.
установить
$ sudo rabbitmq-plugins enable rabbitmq_management
и перейдите по адресу http: // localhost: 15672 / # / queues, если вы используете localhost. пароль по умолчанию будет username: guest
, password: guest
перейдите на вкладку очередей и удалите очередь.
Надеюсь, это может кому-то помочь.
Я пробовал указанные выше фрагменты кода, но не выполнял потоковую передачу.
sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done
.
Я создаю файл, содержащий все имена очередей, и просматриваю его построчно, чтобы удалить их. Для петельwhile read ...
у меня не делал. Он всегда останавливался на первом имени очереди.
Кроме того, если вы хотите удалить одну очередь, приведенные выше решения помогут (python, Java ...), а также do sudo rabbitmqctl delete_queue queue_name
. Я использую rabbitmqctl
вместо rabbitmqadmin
.
С установленным плагином rabbitmq_management вы можете запустить его, чтобы удалить все нежелательные очереди:
rabbitmqctl list_queues -p vhost_name |\
grep -v "fast\|medium\|slow" |\
tr "[:blank:]" " " |\
cut -d " " -f 1 |\
xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost_name>/{}
Давайте разберем команду:
rabbitmqctl list_queues -p vhost_name
перечислит все очереди и сколько задач у них в настоящее время.
grep -v "fast\|medium\|slow"
отфильтрует очереди, которые вы не хотите удалять, скажем, мы хотим удалить каждую очередь без слов быстро , средне или медленно .
tr "[:blank:]" " "
нормализует разделитель на rabbitmqctl между именем очереди и количеством задач, которые есть
cut -d " " -f 1
будет разделить каждую строку на пробел и выберите 1 - й столбец (имя очереди)
xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}
подберет имя очереди и установит его там, где мы установили {}
символ, удаляющий все очереди, не отфильтрованные в процессе.
Убедитесь, что использованный пользователь имеет права администратора.
Я сделал это по-другому, потому что у меня был доступ только к странице управления. Я создал простой «сниппет», который удаляет очереди в Javascript. Вот:
function zeroPad(num, places) {
var zero = places - num.toString().length + 1;
return Array(+(zero > 0 && zero)).join("0") + num;
}
var queuePrefix = "PREFIX"
for(var i=0; i<255; i++){
var queueid = zeroPad(i, 4);
$.ajax({url: '/api/queues/vhost/'+queuePrefix+queueid, type: 'DELETE', success: function(result) {console.log('deleted '+queuePrefix+queueid)}});
}
Все мои очереди были в формате: от PREFIX_0001 до PREFIX_0XXX
Я изо всех сил пытался найти ответ, который соответствовал моим потребностям вручную удалить очередь в rabbigmq. Поэтому я думаю, что в этой теме стоит упомянуть, что можно удалить одну очередь без rabbitmqadmin
использования следующей команды:
rabbitmqctl delete_queue <queue_name>