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

Seb*_*ian 27 python amqp

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

mik*_*ike 35

我知道这个问题有点陈旧,但这里有一个用鼠兔做这个的例子.

关于AMQP和RabbitMQ,如果已经声明了队列,则可以使用被动标志重新声明队列,并保持所有其他队列参数相同.声明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
Run Code Online (Sandbox Code Playgroud)

这将打印以下内容:

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

您将获得该message_count成员发送的消息数.

  • 非常感谢。你的回答对我有帮助。 (2认同)

小智 13

以下是使用pika获取队列长度的方法(考虑到您在localhost上使用默认用户和密码)用队列名称替换q_name.

import pika
connection = pika.BlockingConnection()
channel = connection.channel()
q = channel.queue_declare(q_name)
q_len = q.method.message_count
Run Code Online (Sandbox Code Playgroud)


urs*_*rei 6

你试过PyRabbit吗?它有一个get_queue_depth() 方法,它听起来就像你在找什么.

  • 我不认识PyRabbit。看起来很有希望,我会尝试的! (2认同)

Mic*_*lon 5

有两种方法可以在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协议.