Проверьте размер очереди RabbitMQ от клиента - PullRequest
41 голосов
/ 24 июня 2009

Кто-нибудь знает, есть ли способ проверить количество сообщений в очереди RabbitMQ из клиентского приложения?

Я использую клиентскую библиотеку .NET.

Ответы [ 9 ]

66 голосов
/ 04 марта 2010

Вы действительно можете получить это через клиента. При выполнении операции queue_declare RabbitMQ возвращает три кортежа, содержащие (<queue name>, <message count>, <consumer count>). Аргумент passive для queue_declare позволяет вам проверить, существует ли очередь без изменения состояния сервера. Таким образом, вы можете использовать queue_declare с опцией passive для проверки длины очереди. Не уверен насчет .NET, но в Python это выглядит примерно так:

name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
10 голосов
/ 22 ноября 2010

Я опоздал на 2 года, но я сам искал его и обнаружил, что rabbitmq предоставляет вам простой скрипт для связи с узлами erlang ... в папке sbin, где находится стартовый скрипт для RabbitMQ ... так что вы можете сказать

./rabbitmqctl list_queues

при этом будут отображаться очереди и количество сообщений, ожидающих этих очередей Точно так же вы можете сказать

./rabbitmqctl list_channels
./rabbitmqctl list_connections

и т.д.. Для получения дополнительной информации вы можете посетить здесь

9 голосов
/ 01 апреля 2016

Я использую версию 3.3.1 .Net Client Library.

Я использую следующее, которое очень похоже на второе предложение Ральфа Уилгосса, но вы можете указать имя очереди в качестве аргумента.

QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;
9 голосов
/ 06 февраля 2013

Если вы хотите сделать это в .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
... выполнено.

НТН

5 голосов
/ 09 августа 2017

мой маленький фрагмент на основе ответа Myydrralls. Я думаю, что если бы в его ответе был код, я мог бы заметить его гораздо быстрее.

public uint GetMessageCount(string queueName)
{
    using (IConnection connection = factory.CreateConnection())
    using (IModel channel = connection.CreateModel())
    {
        return channel.MessageCount(queueName);
    }
}
5 голосов
/ 05 августа 2016

Вы можете использовать метод MessageCount IModel, описанный здесь

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)

edit: я знаю, что это очень старый пост, но это первый ответ от Google, и я надеюсь, что он поможет людям в будущем найти этот ответ.

5 голосов
/ 24 июля 2012

Обновление: похоже, что реализация 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)

Надеюсь, это поможет, и, пожалуйста, будьте осторожны, я новичок здесь: -)

2 голосов
/ 28 июля 2017

По крайней мере, начиная с RabbitMQ 3.3.5, это можно сделать в программе на C # без какой-либо клиентской библиотеки RabbitMQ, вызвав API-интерфейс управления RabbitMQ:

// 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.

Ответом будет строка JSON со списком очередей, включая количество сообщений, среди прочих свойств. (Если хотите, вы можете десериализовать этот JSON в объект C #, используя такую ​​библиотеку, как Json.NET .)

Документация API устанавливается вместе с консолью управления RabbitMQ и должна быть доступна на этом сервере по адресу http://MY_RABBITMQ_SERVER:15672/api.

0 голосов
/ 20 марта 2019

Мне удалось получить размер / глубину очереди из программы 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. комбу [пакет с питоном обычно поставляется с установкой из сельдерея]
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-адрес является лишь примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...