在 Pika 中获取队列大小(AMQP Python)

新手上路,请多包涵

简单的问题,但谷歌或 Pika 开源代码没有帮助。有没有办法在 Pika 中查询当前队列大小(项目计数器)?

原文由 Sebastian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 935
2 个回答

在 AMQP 协议中有两种获取队列大小的方法。您可以使用 Queue.Declare 或 Basic.Get。

如果您使用 Basic.Consume 在消息到达时使用它们,那么您将无法获取此信息,除非您断开连接(超时)并重新声明队列,或者获取一条消息但不确认它。在较新版本的 AMQP 中,您可以主动重新排队消息。

至于 Pika,我不知道具体细节,但 AMQP 的 Python 客户端一直是我的眼中钉。通常你需要 monkeypatch 类来获取你需要的信息,或者允许队列消费者超时,这样你就可以定期做其他事情,比如记录统计信息或找出队列中有多少消息。

另一种解决方法是放弃,并使用 Pipe 类来运行 sudo rabbitmqctl list_queues -p my_vhost 。然后解析输出以找到所有队列的大小。如果你这样做,你将需要配置 /etc/sudoers 不要求通常的 sudo 密码。

我祈祷其他有更多 Pika 经验的人通过指出你如何做我提到的所有事情来回答这个问题,在这种情况下我将下载 Pika 并踢轮胎。但是,如果这没有发生,并且您在对 Pika 代码进行猴子修补时遇到困难,那么请查看 haigha 。我发现他们的代码比其他 Python AMQP 客户端库更直接,因为它们更接近 AMQP 协议。

原文由 Michael Dillon 发布,翻译遵循 CC BY-SA 3.0 许可协议

我知道这个问题有点老了,但这里有一个用鼠兔做这个的例子。

关于 AMQP 和 RabbitMQ,如果你已经声明了队列,你可以重新声明队列并打开 passive 标志 并保持所有其他队列参数相同。对此声明 declare-ok 的响应将包括队列中的消息数。

这是鼠兔 0.9.5 的示例:

 import pika

def on_callback(msg):
    print msg

params = pika.ConnectionParameters(
        host='localhost',
        port=5672,
        credentials=pika.credentials.PlainCredentials('guest', 'guest'),
    )

# Open a connection to RabbitMQ on localhost using all default parameters
connection = pika.BlockingConnection(parameters=params)

# Open the channel
channel = connection.channel()

# Declare the queue
channel.queue_declare(
        callback=on_callback,
        queue="test",
        durable=True,
        exclusive=False,
        auto_delete=False
    )

# ...

# Re-declare the queue with passive flag
res = channel.queue_declare(
        callback=on_callback,
        queue="test",
        durable=True,
        exclusive=False,
        auto_delete=False,
        passive=True
    )
print 'Messages in queue %d' % res.method.message_count

这将打印以下内容:

 <Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])>
<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])>
Messages in queue 0

您从 message_count 成员那里获取消息数。

原文由 mike 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏