57

有谁知道是否有办法从客户端应用程序检查 RabbitMQ 队列中的消息数量?

我正在使用 .NET 客户端库。

4

9 回答 9

73

您实际上可以通过客户端检索它。

当你执行一个queue_declare操作时,RabbitMQ 返回一个包含三个值的元组:(<queue name>, <message count>, <consumer count>). passive参数允许您在queue_declare不修改服务器状态的情况下检查队列是否存在,因此您可以使用queue_declarepassive选项来检查队列长度。

不确定 .NET,但在 Python 中,它看起来像这样:

name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
于 2010-03-04T01:37:37.097 回答
17

我迟到了 2 年,但我自己在寻找它,发现 rabbitmq 为你提供了与 erlang 节点通信的简单脚本。它在 RabbitMQ 的启动脚本所在的 sbin 文件夹中。所以你基本上可以说

./rabbitmqctl list_queues

这将显示队列以及等待这些队列的消息数,同样您也可以说

./rabbitmqctl list_channels
./rabbitmqctl list_connections

等有关更多信息,您可以访问这里

于 2010-11-22T16:46:21.020 回答
16

如果您想在 .NET 中执行此操作,请检查您使用的客户端库的版本。

我使用的是2.2.0版本,我必须使用 BasicGet(queue, noAck)。
在这个版本的库中,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;

或者,您可以从命令行调用:

<InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues

您会看到以下输出:

列出队列...
QueueName 1
...完成。

于 2013-02-06T15:55:40.793 回答
9

我正在使用.NET 客户端库的3.3.1版。

我使用以下内容,这与Ralph Willgoss 的第二个建议非常相似,但您可以提供队列名称作为参数。

QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;
于 2016-04-01T07:51:58.780 回答
7

我的小片段基于 Myydrralls 的回答。我想如果他的答案中有代码,我可能会更快地注意到它。

public uint GetMessageCount(string queueName)
{
    using (IConnection connection = factory.CreateConnection())
    using (IModel channel = connection.CreateModel())
    {
        return channel.MessageCount(queueName);
    }
}
于 2017-08-09T17:10:45.347 回答
6

您可以使用 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)

编辑:我知道这是一个非常古老的帖子,但它是谷歌的第一个回复,我希望它能帮助人们在未来寻找这个答案。

于 2016-08-05T16:50:50.903 回答
5

更新:自从 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)

希望这会有所帮助,请放轻松,我是新来的:-)

于 2012-07-24T18:21:30.480 回答
3

至少从 RabbitMQ 3.3.5 开始,您可以通过调用 RabbitMQ 管理 HTTP API 在没有任何 RabbitMQ 客户端库的 C# 程序中执行此操作:

// The last segment of the URL is the RabbitMQ "virtual host name". 
// The default virtual host name is "/", represented urlEncoded by "%2F".
string queuesUrl = "http://MY_RABBITMQ_SERVER:15672/api/queues/%2F";

WebClient webClient = new WebClient { Credentials = new NetworkCredential("MY_RABBITMQ_USERNAME", "MY_RABBITMQ_PASSWORD") };
string response = webClient.DownloadString(queuesUrl);

用户名和密码与您用于登录 RabbitMQ 管理控制台 UI 的用户名和密码相同。

响应将是一个 JSON 字符串,其中包含队列列表,包括它们的消息计数以及其他属性。(如果您愿意,可以使用Json.NET 之类的库将该 JSON 反序列化为 C# 对象。)

API 文档与 RabbitMQ 管理控制台一起安装,并且应该在该服务器上的http://MY_RABBITMQ_SERVER:15672/api上可用。

于 2017-07-28T03:05:25.140 回答
3

我能够从 python 程序中获取队列的大小/深度。

  1. 使用 py_rabbit
    from pyrabbit.api import Client
    cl = Client('10.111.123.54:15672', 'userid', 'password',5)
    depth = cl.get_queue_depth('vhost', 'queue_name')
  1. kombu [一个python包通常带有celery安装]
conn = kombu.Connection('amqp://userid:password@10.111.123.54:5672/vhost')
conn.connect()
client = conn.get_manager()
queues = client.get_queues('vhost')
for queue in queues:
    if queue == queue_name:
    print("tasks waiting in queue:"+str(queue.get("messages_ready")))
    print("tasks currently running:"+str(queue.get("messages_unacknowledged")))

IP地址只是一个例子。

编辑:

3

我找到了一个更好的方法来做到这一点。curl 似乎是一种更方便、更快捷的方法


curl -s -i -u $user:$password http://$host_ip_address:15672/api/queues/$vhost_name/$queue_name | sed 's/,/\n/g' | grep '"messages"' | sed 's/"messages"://g'
于 2019-03-20T16:13:30.213 回答