Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 从客户端检查RabbitMQ队列大小_.net_Message Queue_Rabbitmq_Amqp - Fatal编程技术网

.net 从客户端检查RabbitMQ队列大小

.net 从客户端检查RabbitMQ队列大小,.net,message-queue,rabbitmq,amqp,.net,Message Queue,Rabbitmq,Amqp,有人知道是否有方法检查来自客户端应用程序的RabbitMQ队列中的消息数吗 我正在使用.NET客户端库。您实际上可以通过客户端检索此库 当执行队列声明操作时,RabbitMQ返回一个包含三个值的元组:(,)。queue\u declare的passive参数允许您在不修改服务器状态的情况下检查队列是否存在,因此您可以使用queue\u declare和passive选项来检查队列长度 对于.NET不太清楚,但在Python中,它看起来是这样的: name,jobs,consumers=chan.

有人知道是否有方法检查来自客户端应用程序的RabbitMQ队列中的消息数吗


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

您实际上可以通过客户端检索此库

当执行
队列声明
操作时,RabbitMQ返回一个包含三个值的元组:
(,)
queue\u declare
passive
参数允许您在不修改服务器状态的情况下检查队列是否存在,因此您可以使用
queue\u declare
passive
选项来检查队列长度

对于.NET不太清楚,但在Python中,它看起来是这样的:

name,jobs,consumers=chan.queue\u声明(queue=queuename,passive=True)

我已经晚了2年,但我自己在搜索它,发现rabbitmq提供了与erlang节点通信的简单脚本..它位于sbin文件夹中,rabbitmq的起始脚本位于该文件夹中..因此基本上可以说

./rabbitmqctl list_queues
这将显示队列以及等待到这些队列的消息计数 同样你也可以说

./rabbitmqctl list_channels
./rabbitmqctl list_connections
等等。
欲了解更多信息,请访问更新:自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)

希望这能有所帮助,请对我放松点,我是这里的新手:-)

如果您想在.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
\sbin\rabbitmqctl.bat列表\u队列
您将看到以下输出:

正在列出队列…
队列名称1
…完成


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

我使用了以下内容,这与非常类似,但您可以将队列名称作为参数提供

QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;

您可以使用IModel的MessageCount方法,这里有文档记录


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

至少从RabbitMQ 3.3.5开始,您可以在没有任何RabbitMQ客户端库的C程序中通过调用RabbitMQ管理HTTP API来做到这一点:

// 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反序列化为C#对象。)


API文档与RabbitMQ管理控制台一起安装,应该在该服务器上提供。

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

public uint GetMessageCount(string queueName)
{
    using (IConnection connection = factory.CreateConnection())
    using (IModel channel = connection.CreateModel())
    {
        return channel.MessageCount(queueName);
    }
}

我能够从python程序中获得队列的大小/深度。 1.用白兔

    from pyrabbit.api import Client
    cl = Client('10.111.123.54:15672', 'userid', 'password',5)
    depth = cl.get_queue_depth('vhost', 'queue_name')
  • kombu[python软件包通常附带芹菜安装]

  • ip地址只是一个例子

    这应该是可以接受的答案,即使他确实错过了基本的。作为这个信息的第二个来源。chan在这里是什么以及如何导入它?这不再是最好的方法。@YouThey发现这样的评论“这不再是最好的方法”非常令人沮丧没有提到你所指的改进方式。为什么不分享你的发现呢?在你的IModel上使用MessageCount()函数。如果向下滚动,您将看到两个答案提到了这个问题的函数。channel.queue_declare返回一个包含当前消息计数的对象,因此,如果您希望避免回调,您还可以像这样访问消息计数:myChannel.method.message_count这是我第一次看到提到的。为什么?!!
    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")))