Используя RabbitMQ, есть ли способ просмотреть содержимое очереди без операции удаления из очереди?
В качестве способа изучения RabbitMQ и python я работаю над проектом, который позволяет мне распространять кодировки h264 между несколькими компьютерами. Основы сделаны, у меня есть демон, который работает на Linux или Mac, который присоединяется к очереди, принимает задания и кодирует их с помощью HandBrakeCLI и получает сообщение после завершения кодирования. Я также создал простой инструмент для ввода элементов в очередь.
Теперь я хочу расширить возможности инструмента, который толкает элементы в очередь, чтобы я мог просматривать то, что находится в очереди. Я знаю о возможности видеть, сколько элементов находится в очереди, но я хочу, чтобы иметь возможность получать фактические сообщения, чтобы я мог показать, какое кино или телешоу ждет, пока они еще не закодированы. Идея заключается в том, что диспетчер очереди получал сообщения от клиентов кодера, когда задание завершено, а затем обновляет список очередей.
Я знаю, что существует сложный способ сохранить список менеджеров очередей в синхронизации с реальной рабочей очередью, но я бы хотел, чтобы это было "постоянным", поскольку я должен был бы закрыть диспетчер очереди и снова открыть его позже см. очередь.
Ответы
Ответ 1
Просмотр очереди не поддерживается напрямую, но если вы объявляете очередь с НЕТ автоматическими подтверждениями и не активируете полученные сообщения, то вы можете видеть все в ней. После того, как вы посмотрели, отправьте ОТМЕНА на канал или отключите и снова подключите, чтобы вызвать все сообщения. Это увеличивает число в заголовках сообщений, но в остальном сообщения остаются нетронутыми.
Я построил приложение, где упорядочение сообщений было не очень важно, и я часто просматривал очередь таким образом. Если бы я нашел проблему, я бы сбросил сообщения в файл, исправлю их и повторно отправлю.
Если вам нужно только заглянуть в сообщение или два раз в то время, вы можете сделать это с помощью плагина управления RabbitMQ.
Кроме того, если вам нужно только количество сообщений, вы можете получить это каждый раз, когда вы объявляете очередь, или в команде basic.get.
Ответ 2
@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(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
Ответ 3
То, что вы хотите сделать, называется просмотр очереди, хотя я собираюсь из this, что RabbitMQ еще не поддерживайте это.