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

Dus*_*tin 41 python esb amqp rabbitmq

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

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

我知道有一种令人费解的方法可以保持队列管理器的列表与实际工作队列同步,但我希望这是"持久的",因为我应该能够关闭队列管理器并稍后重新打开以查看队列.

Mic*_*lon 38

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

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

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

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

  • 只是为了扩展消息计数获取,您可以使用passive = True声明一个队列,如果它不存在则不会创建队列.如果是这样,您将获得消息和消费者的数量. (2认同)

小智 7

@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()
Run Code Online (Sandbox Code Playgroud)

  • 这非常有帮助,但我很难找到一种不会无限期阻止的方法。基本上我只想在队列中查看固定数量的消息,而不需要坐下来等待更多消息进入。有什么想法吗? (2认同)