Получение количества сообщений в очереди RabbitMQ

Мы используем amqplib для публикации/потребления сообщений. Я хочу иметь возможность читать количество сообщений в очереди (в идеале, как подтвержденных, так и неподтвержденных). Это позволит мне показать диаграмму состояния для пользователей admin и определить, не поддерживает ли какой-то компонент нагрузку.

Я не могу найти какую-либо информацию в документах amqplib о состоянии чтения очереди.

Может ли кто-нибудь указать мне в правильном направлении?

Ответ 1

Использование pika:

import pika

pika_conn_params = pika.ConnectionParameters(
    host='localhost', port=5672,
    credentials=pika.credentials.PlainCredentials('guest', 'guest'),
)
connection = pika.BlockingConnection(pika_conn_params)
channel = connection.channel()
queue = channel.queue_declare(
    queue="your_queue", durable=True,
    exclusive=False, auto_delete=False
)

print(queue.method.message_count)

Использование PyRabbit:

from pyrabbit.api import Client
cl = Client('localhost:55672', 'guest', 'guest')
cl.get_messages('example_vhost', 'example_queue')[0]['message_count']

Использование HTTP

Синтаксис:

curl -i -u user:password http://localhost:15672/api/queues/vhost/queue

Пример:

curl -i -u guest:guest http://localhost:15672/api/queues/%2f/celery           

Примечание. По умолчанию vhost - это /, который должен быть экранирован как %2f

Использование CLI:

$ sudo rabbitmqctl list_queues | grep 'my_queue'

Ответ 2

после ответа ChillarAnand вы можете легко получить значение. данные находятся в объекте.

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
            host='localhost',
            port=5672,
            credentials=pika.credentials.PlainCredentials('guest', 'guest'),
        )
channel = connection.channel()
print(channel.queue_declare(queue="your_queue", durable=True,  exclusive=False,
                  auto_delete=False).method.message_count)

и вы получите точный номер сообщения

Ответ 3

Используя Java API, вы можете сделать следующее:

channel.queueDeclarePassive(queueName).getMessageCount()

Я считаю, что это также доступно с amqplib (согласно https://code.google.com/p/py-amqplib/source/browse/amqplib/client_0_8/channel.py#1356 кажется, что queue_declare() возвращает кортеж с количеством сообщений)

Если вам нужны более точные показатели (особенно количество сообщений nack), вам нужно использовать rabbitmqctl или rabbitmq_management. Rabbitmq_management, вероятно, является хорошим выбором благодаря HTTP API. Дополнительная информация: http://www.rabbitmq.com/management.html

Ответ 4

  1. To Retrive Message from RabbitMQ we need to first connect with RabbitMQ server 

    public WebClient GetRabbitMqConnection(string userName, string password)
    {
        var client = new WebClient(); 
        client.Credentials = new NetworkCredential(userName, password);
        return client;
    }

 2. Now retrieve message from RabbitMQ using below code.

      public string GetRabbitMQMessages(string domainName, string port, string 
                    queueName, string virtualHost, WebClient client, string 
                    methodType)
      {
                  string messageResult = string.Empty;
                  string strUri = "http://" + domainName + ":" + port + 
                                  "/api/queues/" + virtualHost + "/";
                  var data = client.DownloadString(strUri + queueName + "/");
                  var queueInfo = JsonConvert.DeserializeObject<QueueInfo>(data);
                  if (queueInfo == null || queueInfo.messages == 0)
                             return string.Empty;
                  if (methodType == "POST")
                  {
                      string postbody = "  
                      {\"ackmode\":\"ack_requeue_true\",\"count\":
                       \"$totalMessageCount\",\"name\":\"${DomainName}\",
                       \"requeue\":\"false\",\"encoding\":\"auto\",\"vhost\" :
                       \"${QueueName}\"}";
                       postbody = postbody.Replace("$totalMessageCount", 
                       queueInfo.messages.ToString()).Replace("${DomainName}", 
                       domainName).Replace("${QueueName}", queueName);
                       messageResult = client.UploadString(strUri + queueName + 
                       "/get", "POST", postbody);
                }
                return messageResult;
    } 


   I think this will help you to implement RabbitMQ.