有谁知道是否有办法从客户端应用程序检查RabbitMQ队列中的消息数量?
我正在使用.NET客户端库.
你实际上可以通过客户端检索这个.执行queue_declare
操作时,RabbitMQ返回一个包含的三元组(
.passive
queue_declare 的参数允许您在不修改服务器状态的情况下检查队列是否存在.所以,你可以使用queue_declare
与passive
选项来检查队列长度.不确定.NET,但在Python中它看起来像这样:
name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
我已经2年了,但我自己也在寻找它,发现rabbitmq给你简单的脚本与erlang节点进行通信..在sbin文件夹中,RabbitMQ的起始脚本位于...所以你基本上可以说
./rabbitmqctl list_queues
这将显示队列以及等待这些队列的消息计数,您也可以这样说
./rabbitmqctl list_channels ./rabbitmqctl list_connections
有关更多信息,请访问此处
如果您想在.Net中执行此操作,请检查您正在使用的客户端库版本.
我正在使用2.2.0版本,我不得不使用BasicGet(queue,noAck).
在此版本的Library QueueDeclare()中,只返回包含队列名称的字符串.
BasicGetResult result = channel.BasicGet("QueueName", false); uint count = result != null ? result.MessageCount : 0;
我知道在2.6.1版本中,QueueDeclare()返回一个QueueDeclareOk类型的对象.
QueueDeclareOk result = channel.QueueDeclare(); uint count = result.MessageCount;
或者,您可以从命令行调用:
\sbin\rabbitmqctl.bat list_queues
你看到以下输出:
列出队列...
QueueName 1
...完成.
HTH
我正在使用.Net客户端库的3.3.1版.
我使用以下内容,这与Ralph Willgoss第二个建议非常相似,但您可以提供队列名称作为参数.
QueueDeclareOk result = channel.QueueDeclarePassive(queueName); uint count = result != null ? result.MessageCount : 0;
您可以使用此处记录的IModel的MessageCount方法
http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v3.6.4/rabbitmq-dotnet-client-3.6.4-client-htmldoc/html/type-RabbitMQ.Client.IModel.html#method- M:RabbitMQ.Client.IModel.MessageCount(System.String)
编辑:我知道这是一个很老的帖子,但这是google的第一个回复,我希望它将对以后寻求此答案的人们有所帮助。
更新:似乎自mmalone非常有用的帖子以来,queue_declare(..)的pika实现已经改变.
在python/pika(v0.9.5)中,仍然可以通过pika检查队列深度,但它需要稍微更间接的方法.
queue_declare(...)将方法对象传递给其回调函数,然后您可以检查该函数.例如,要检查名为的队列中的消息和使用者的数量'myQueue'
:
def cbInspect(qb): messagesInQueue = qb.method.message_count print "There are %d messages in myQueue" % messagesInQueue consumersInQueue = qb.method.consumer_count print "There are %d consumers in myQueue" % consumersInQueue return myChannel = channel.queue_declare(callback=cbInspect, queue='myQueue', passive=True)
希望这会有所帮助,请放轻松我,我是新来的:-)
我的小片段基于Myydrralls的回答.我想如果他的答案中有代码我可能会更快地注意到它.
public uint GetMessageCount(string queueName) { using (IConnection connection = factory.CreateConnection()) using (IModel channel = connection.CreateModel()) { return channel.MessageCount(queueName); } }