使用RabbitMQ是否可以在没有出列的情况下查看队列内容?

时间:2011-01-15 15:13:55

标签: python rabbitmq esb amqp

作为一种学习RabbitMQ和python的方法我正在开发一个允许我在多台计算机之间分发h264编码的项目。完成了基础知识,我有一个在Linux或Mac上运行的守护程序,它连接到队列,接受作业并使用HandBrakeCLI对它们进行编码,并在编码完成后确认消息。我还构建了一个简单的工具来将项目推入队列。

现在我想扩展将项目推入队列的工具的功能,以便我可以查看队列中的内容。我知道有能力查看队列中有多少项,但我希望能够获得实际的消息,这样我就可以显示正在等待编码的电影或电视节目。我们的想法是,队列管理器将在作业完成后从编码器客户端接收消息,然后刷新队列列表。

我知道有一种令人费解的方式让队列管理器的列表与实际的工作队列保持同步,但我希望这是“持久的”,因为我应该能够关闭队列管理器并稍后重新打开它看到队列。

3 个答案:

答案 0 :(得分:37)

不直接支持队列浏览,但如果您声明没有自动确认的队列并且不确认收到的消息,那么您可以看到其中的所有内容。看了之后,在通道上发送CANCEL,或断开连接并重新连接以使所有消息重新排队。这会在消息头中增加一个数字,但不会保持消息不变。

我构建了一个应用程序,其中消息排序不是非常重要,我经常以这种方式扫描队列。如果我发现了问题,我会将消息转储到文件中,修复它们并重新提交。

如果您只需要偶尔查看一两条消息,可以使用RabbitMQ管理插件执行此操作。

此外,如果您只需要一个消息计数,则可以在每次声明队列时或在basic.get命令上获得该消息。

答案 1 :(得分: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()

答案 2 :(得分:0)

您想要做的事情被称为浏览队列,尽管我从this收集了RabbitMQ尚不支持的内容。