Использование RabbitMQ: Как просмотреть содержимое очереди без операции извлечения?
Я работаю над проектом, который позволяет распределять кодирование h264 между несколькими компьютерами, используя RabbitMQ и Python. Основная часть уже выполнена: у меня есть демон, который работает на Linux или Mac, подключается к очереди, принимает задания и выполняет кодирование с помощью HandBrakeCLI, после чего подтверждает завершение работы. Кроме того, я разработал простой инструмент для отправки задач в очередь.
Теперь я хочу расширить возможности инструмента, который отправляет элементы в очередь, чтобы можно было просматривать содержимое очереди. Я знаю, что есть возможность видеть, сколько элементов находится в очереди, но мне нужно получить фактические сообщения, чтобы отобразить, какой фильм или телешоу ожидает кодирования. Идея заключается в том, что менеджер очереди будет получать сообщения от клиентов-кодировщиков, когда задача завершена, и затем обновлять список очереди.
Я понимаю, что есть сложный способ синхронизации списка менеджера очереди с фактической рабочей очередью, но мне хотелось бы сделать это "постоянным", чтобы я мог закрыть менеджер очереди и открыть его позже, чтобы видеть состояние очереди.
2 ответ(ов)
Очередь для просмотра сообщений напрямую не поддерживается, но если вы объявите очередь без автоматических подтверждений и не будете подтверждать сообщения, которые получаете, то сможете увидеть все сообщения в очереди. После просмотра вы можете отправить CANCEL на канал или отключиться и подключиться заново, чтобы все сообщения вернулись в очередь. Это увеличивает один из числовых показателей в заголовках сообщения, но в остальном оставляет сообщения нетронутыми.
Я разработал приложение, где порядок сообщений не был критичен, и часто использовал этот способ для ознакомления с очередью. Если я находил какие-то проблемы, я экспортировал сообщения в файл, исправлял их и отправлял снова.
Если вам нужно лишь время от времени заглянуть в одно или два сообщения, это можно сделать с помощью плагина управления RabbitMQ.
Кроме того, если вам нужно узнать только количество сообщений, вы можете получить эту информацию каждый раз, когда объявляете очередь или выполняете команду basic.get.
@MichaelDillon, основываясь на вашем ответе и чтобы облегчить жизнь другим, я размещаю здесь пример без подтверждения (no_ack
):
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='Q.hello')
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
# ch.basic_ack(delivery_tag=method.delivery_tag) # Здесь подтверждение отключено
channel.basic_consume(callback, queue='Q.hello')
print(' [*] Ожидание сообщений. Для выхода нажмите CTRL+C')
channel.start_consuming()
Этот код создает соединение с RabbitMQ, объявляет очередь и запускает функцию обратного вызова, которая будет вызвана при получении сообщений из очереди. Обратите внимание, что строка с вызовом ch.basic_ack
закомментирована, что означает отключение механизма подтверждения.
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Преобразование списка словарей в DataFrame pandas
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Как явно освободить память в Python?
Выбор строки из pandas Series/DataFrame по целочисленному индексу