Dus*_*tin 41 python esb amqp rabbitmq
作为学习RabbitMQ和python的一种方法,我正在开发一个项目,允许我在许多计算机之间分发h264编码.完成了基础知识,我有一个在Linux或Mac上运行的守护程序,它连接到队列,接受作业并使用HandBrakeCLI对它们进行编码,并在编码完成后确认消息.我还构建了一个简单的工具来将项目推入队列.
现在我想扩展将项目推入队列的工具的功能,以便我可以查看队列中的内容.我知道能够看到队列中有多少项目,但我希望能够获得实际的消息,这样我就可以显示正在等待编码的电影或电视节目.我们的想法是,队列管理器将在作业完成后从编码器客户端接收消息,然后刷新队列列表.
我知道有一种令人费解的方法可以保持队列管理器的列表与实际工作队列同步,但我希望这是"持久的",因为我应该能够关闭队列管理器并稍后重新打开以查看队列.
Mic*_*lon 38
不直接支持队列浏览,但如果您声明一个没有自动确认的队列并且不确认收到的消息,那么您可以看到其中的所有内容.看了之后,在通道上发送CANCEL,或断开连接并重新连接以使所有消息重新排队.这会在消息头中增加一个数字,但不会保持消息不变.
我构建了一个应用程序,其中消息排序不是非常重要,我经常以这种方式扫描队列.如果我发现问题,我会将消息转储到文件中,修复它们并重新提交.
如果您只需要偶尔查看一两条消息,可以使用RabbitMQ管理插件执行此操作.
此外,如果您只需要消息计数,则可以在每次声明队列时或在basic.get命令上获取消息.
小智 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)