Вопрос по .net – Проверьте размер очереди RabbitMQ от клиента

41

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

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

Ваш Ответ

8   ответов
65

Вы можете получить это через клиента. Когда выполнить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)
Это должен быть принятый ответ, даже если он пропустил Basic.Get как второй источник этой информации. Michael Dillon
Это уже не лучший способ сделать это. Theyouthis
Что такое Чан здесь и как его импортировать? Kishan
Используйте функцию MessageCount () на вашей IModel. Если вы прокрутите вниз, то увидите, что в двух ответах упоминается функция по этому вопросу. Theyouthis
@ theyouthis Очень неприятно находить комментарии типа «Это уже не лучший способ сделать это» без какой-либо ссылки на улучшенный способ, на который вы ссылаетесь. Почему бы не поделиться своими выводами? spender
10

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

./rabbitmqctl list_queues

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

./rabbitmqctl list_channels
./rabbitmqctl list_connections

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

9

проверьте, какую версию клиентской библиотеки вы используете.

Я использую 2.2.0 версия, и мне пришлось использовать BasicGet (очередь, noAck).
В этой версии библиотеки QueueDeclare () возвращает только строку, содержащую имя очереди.

BasicGetResult result = channel.BasicGet("QueueName", false);
uint count = result != null ? result.MessageCount : 0;


Я знаю по 2.6.1 version, QueueDeclare () возвращает объект типа QueueDeclareOk.

QueueDeclareOk result = channel.QueueDeclare();
uint count = result.MessageCount;


Кроме того, вы можете позвонить из командной строки:

<InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues

И вы видите следующий вывод:

Списки очередей ...
QueueName 1
...сделанный

НТН

9

@ 3.3 клиентской библиотеки .Net.

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

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

похоже, что реализация 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 corford
5

если бы в его ответе был код, я бы заметил это гораздо быстрее.

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

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 -М: RabbitMQ.Client.IModel.MessageCount (System.String)

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

Это первый раз, когда я это упомянул. Почему это?! Theyouthis
2

начиная с 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.

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

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

Похожие вопросы