2011-11-19 125 views

回答

6

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

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

至于鼠兔,我不知道具体细节,但对AMQP Python的客户一直在我的眼中钉。通常,您需要monkeypatch类才能获取所需信息,或者允许队列使用者超时,以便可以按照记录统计信息的周期间隔执行其他操作,或查找队列中有多少个消息。

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

我祈求别人更多的经验,鼠兔通过指出你如何能做到的一切,我所提到的事情,在这种情况下,我会下载鼠兔和浅尝辄止回答了这个。但是,如果没有发生这种情况,并且您难以单独对Pika代码进行编码,请查看haigha。我发现他们的代码比其他Python AMQP客户端库更直接,因为他们更贴近AMQP协议。

+0

感谢您的sudo rabbitmqctl list_queues -p my_vhost技巧,我会尽力而为。 – Sebastian

6

你试过PyRabbit?它有一个get_queue_depth()method这听起来像你在找什么。

+1

我不知道PyRabbit。看起来很有希望,我会试试看! – Sebastian

28

我知道这个问题是有点老了,但这里是高原鼠兔与这样的一个例子。

关于AMQP和RabbitMQ,如果您已经声明了该队列,则可以重新声明该队列,其中passive flag开启并保持所有其他队列参数相同。对此声明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成员的邮件数量。

+1

非常感谢。你的回答对我有帮助。 – Evgeniy

9

以下是如何使用pika获取队列长度(考虑您在本地主机上使用默认用户和密码) 用您的队列名称替换q_name。

import pika 
connection = pika.BlockingConnection() 
channel = connection.channel() 
q = channel.queue_declare(q_name) 
q_len = q.method.message_count