【问题标题】:Check RabbitMQ queue size from client从客户端检查 RabbitMQ 队列大小
【发布时间】:2010-11-05 12:23:50
【问题描述】:

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

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

【问题讨论】:

    标签: .net message-queue rabbitmq amqp


    【解决方案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包,通常自带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'
    

    【讨论】:

      【解决方案2】:

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

      我使用以下,它与Ralph Willgoss's second suggestion 非常相似,但您可以提供队列名称作为参数。

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

      【讨论】:

        【解决方案3】:

        如果您想在 .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
        ...完成。

        【讨论】:

          【解决方案4】:

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

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

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

          name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
          

          【讨论】:

          • 这应该是公认的答案,即使他确实错过了 Basic.Get 作为此信息的第二个来源。
          • 这里的chan是什么,如何导入?
          • 这不再是最好的方法了。
          • @Theyouthis 找到像“这不再是最好的方法”这样的 cmets 非常令人沮丧,而没有任何参考您所指的改进方法。为什么不分享您的发现?
          • 在 IModel 上使用 MessageCount() 函数。如果你向下滚动,你会看到两个答案提到这个问题的功能。
          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            至少从 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 上可用。

            【讨论】:

              【解决方案7】:

              您可以使用此处记录的 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)

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

              【讨论】:

              • 这是我第一次看到提到这个。这是为什么呢?!!
              【解决方案8】:

              更新:queue_declare(..) 的 pika 实现似乎在 mmalone 非常有用的帖子之后发生了变化。

              在 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)
              

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

              【讨论】:

              • channel.queue_declare 返回一个包含当前消息计数的对象,因此如果您想避免回调,也可以像这样访问消息计数:myChannel.method.message_count
              【解决方案9】:

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

              ./rabbitmqctl list_queues
              

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

              ./rabbitmqctl list_channels
              ./rabbitmqctl list_connections
              

              等等。 欲了解更多信息,您可以访问here

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-05-28
                • 1970-01-01
                • 2012-07-11
                • 2019-04-08
                • 2019-03-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多