0

Использование RabbitMQ: Как просмотреть содержимое очереди без операции извлечения?

16

Я работаю над проектом, который позволяет распределять кодирование h264 между несколькими компьютерами, используя RabbitMQ и Python. Основная часть уже выполнена: у меня есть демон, который работает на Linux или Mac, подключается к очереди, принимает задания и выполняет кодирование с помощью HandBrakeCLI, после чего подтверждает завершение работы. Кроме того, я разработал простой инструмент для отправки задач в очередь.

Теперь я хочу расширить возможности инструмента, который отправляет элементы в очередь, чтобы можно было просматривать содержимое очереди. Я знаю, что есть возможность видеть, сколько элементов находится в очереди, но мне нужно получить фактические сообщения, чтобы отобразить, какой фильм или телешоу ожидает кодирования. Идея заключается в том, что менеджер очереди будет получать сообщения от клиентов-кодировщиков, когда задача завершена, и затем обновлять список очереди.

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

2 ответ(ов)

0

Очередь для просмотра сообщений напрямую не поддерживается, но если вы объявите очередь без автоматических подтверждений и не будете подтверждать сообщения, которые получаете, то сможете увидеть все сообщения в очереди. После просмотра вы можете отправить CANCEL на канал или отключиться и подключиться заново, чтобы все сообщения вернулись в очередь. Это увеличивает один из числовых показателей в заголовках сообщения, но в остальном оставляет сообщения нетронутыми.

Я разработал приложение, где порядок сообщений не был критичен, и часто использовал этот способ для ознакомления с очередью. Если я находил какие-то проблемы, я экспортировал сообщения в файл, исправлял их и отправлял снова.

Если вам нужно лишь время от времени заглянуть в одно или два сообщения, это можно сделать с помощью плагина управления RabbitMQ.

Кроме того, если вам нужно узнать только количество сообщений, вы можете получить эту информацию каждый раз, когда объявляете очередь или выполняете команду basic.get.

0

@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 закомментирована, что означает отключение механизма подтверждения.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь