简单的问题,但谷歌或 Pika 开源代码没有帮助。有没有办法在 Pika 中查询当前队列大小(项目计数器)?
原文由 Sebastian 发布,翻译遵循 CC BY-SA 4.0 许可协议
简单的问题,但谷歌或 Pika 开源代码没有帮助。有没有办法在 Pika 中查询当前队列大小(项目计数器)?
原文由 Sebastian 发布,翻译遵循 CC BY-SA 4.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 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答884 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
在 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 协议。