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

41

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

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

Ваш Ответ

8   ответов
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
10

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

./rabbitmqctl list_queues

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

./rabbitmqctl list_channels
./rabbitmqctl list_connections

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

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

НТН

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
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 / апи .

9

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

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

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

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

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

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