2009-06-24 11 views

ответ

64

Фактически вы можете получить это через клиента. При выполнении операции 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) 
+0

Это должен быть принятый ответ, даже если он пропустил Basic.Get как второй источник этой информации. –

+1

Что здесь chan и как его импортировать? – Kishan

+0

Это уже не лучший способ сделать это. – Theyouthis

10

Я 2 года слишком поздно, но я искал это сам и обнаружил, что RabbitMQ дает и простой скрипт для связи с Erlang узлы .. его в SBIN папке, где исходный сценарий для RabbitMQ является located..so вы можете в основном сказать

./rabbitmqctl list_queues 

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

./rabbitmqctl list_channels 
./rabbitmqctl list_connections 

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

5

Update: оказывается, что пищуха реализация queue_declare (..) изменилась с очень полезным постом 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) 

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

+0

channel.queue_declare возвращает объект, который содержит текущее количество сообщений, поэтому, если вы хотите избежать обратного вызова, вы также можете получить доступ к сообщению, например: myChannel.method.message_count – corford

10

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

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

Listing очереди ...
ИмяОчереди 1
. ..сделанный.

НТН

6

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

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

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

Вы можете использовать метод 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)

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

+0

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

1

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

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

1

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

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