从客户端检查RabbitMQ队列大小

.net message-queue rabbitmq amqp

31071 观看

9回复

1752 作者的声誉

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

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

作者: Pablote 的来源 发布者: 2009 年 6 月 24 日

回应 (9)


65

1586 作者的声誉

决定

你实际上可以通过客户端检索这个。执行queue_declare操作时,RabbitMQ返回一个包含的三元组(<queue name>, <message count>, <consumer count>)passivequeue_declare 的参数允许您在不修改服务器状态的情况下检查队列是否存在。所以,你可以使用queue_declarepassive选项来检查队列长度。不确定.NET,但在Python中它看起来像这样:

name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
作者: mmalone 发布者: 04.03.2010 01:37

10

622 作者的声誉

我已经2年了,但我自己也在寻找它,发现rabbitmq给你简单的脚本与erlang节点进行通信..在sbin文件夹中,RabbitMQ的起始脚本位于...所以你基本上可以说

./rabbitmqctl list_queues

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

./rabbitmqctl list_channels
./rabbitmqctl list_connections

有关更多信息,请访问此处

作者: Rafi 发布者: 22.11.2010 04:46

5

4170 作者的声誉

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

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

作者: tohster 发布者: 24.07.2012 06:21

9

7523 作者的声誉

如果您想在.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;


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

<InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues

你看到以下输出:

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

HTH

作者: Ralph Willgoss 发布者: 06.02.2013 03:55

9

303 作者的声誉

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

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

QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;
作者: Mike 发布者: 01.04.2016 07:51

4

58 作者的声誉

您可以使用此处记录的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- L:RabbitMQ.Client.IModel.MessageCount(System.String)

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

作者: Myddraall 发布者: 05.08.2016 04:50

2

13615 作者的声誉

至少从RabbitMQ 3.3.5开始,您可以通过调用RabbitMQ Management 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提供

作者: Jon Schneider 发布者: 28.07.2017 03:05

5

53 作者的声誉

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

public uint GetMessageCount(string queueName)
{
    using (IConnection connection = factory.CreateConnection())
    using (IModel channel = connection.CreateModel())
    {
        return channel.MessageCount(queueName);
    }
}
作者: William Haggerty 发布者: 09.08.2017 05:10

0

1 作者的声誉

我能够从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包通常附带芹菜安装]
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")))

作者: Mir Al-Masud 发布者: 20.03.2019 04:13
32x32