2009-06-24 12 views

Odpowiedz

64

Rzeczywiście można pobrać to za pośrednictwem klienta. Podczas wykonywania operacji queue_declare RabbitMQ zwraca trzykrotną krotkę zawierającą (<queue name>, <message count>, <consumer count>). Argument passive dla queue_declare pozwala sprawdzić, czy kolejka istnieje bez modyfikowania stanu serwera. Aby sprawdzić długość kolejki, można użyć opcji queue_declare za pomocą opcji passive. Nie jestem pewien .NET, ale w Pythonie to wygląda mniej więcej tak:

name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True) 
+0

To powinna być zaakceptowana odpowiedź, nawet jeśli pominął Basic.Get jako drugie źródło tej informacji. –

+1

Co to jest chan tutaj i jak go zaimportować? – Kishan

+0

To już nie jest najlepszy sposób na zrobienie tego. – Theyouthis

10

Jestem 2 lata za późno, ale szukałem dla niego się i stwierdził, że RabbitMQ daje u prosty skrypt do komunikowania się węzłów Erlang .. jej w sbin folderu, w którym skrypt wywoławcza RabbitMQ jest located..so można w zasadzie powiedzieć

./rabbitmqctl list_queues 

ten wyświetli kolejki wraz z liczbą wiadomości oczekujących na tych kolejek podobnie można również powiedzieć

./rabbitmqctl list_channels 
./rabbitmqctl list_connections 

itp Więcej informacji można znaleźć here

5

Aktualizacja: wydaje się, że pika realizacja queue_declare (..) zmieniła się od mmalone bardzo pomocne post.

W python/pika (v0.9.5) nadal można sprawdzić głębokość kolejki za pomocą pika, ale wymaga to nieco bardziej pośredniego podejścia.

queue_declare (...) przekazuje obiekt metody do swojej funkcji wywołania zwrotnego, którą można następnie sprawdzić. Na przykład, aby sprawdzić liczbę wiadomości i konsumentów w kolejce o nazwie '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) 

Hope this helps, i przejdź łatwe na mnie, jestem tu nowy :-)

+0

channel.queue_declare zwraca obiekt zawierający bieżącą liczbę wiadomości, więc jeśli chcesz uniknąć wywołania zwrotnego, możesz również uzyskać dostęp do wiadomości w następujący sposób: myChannel.method.message_count – corford

10

Jeśli chciałem to zrobić w .Net, sprawdź, której wersji biblioteki klienta używasz.

Używam wersji 2.2.0 i musiałem użyć BasicGet (queue, noAck).
W tej wersji biblioteki QueueDeclare() zwraca tylko ciąg zawierający nazwę kolejki.

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


wiem od wersji 2.6.1, QueueDeclare() zwraca obiekt typu QueueDeclareOk.

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


Alternatywnie, można wywołać z linii poleceń:

<InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues 

I zobaczysz następujący wynik:

kolejki szczegóły ...
nazwa_kolejki 1
. ..Gotowe.

HTH

6

używam wersji 3.3.1 z .NET biblioteki klienta.

Używam następującego, który jest bardzo podobny do drugiej sugestii Ralpha Willgossa, ale możesz podać nazwę kolejki jako argument.

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

Można użyć metody MessageCount w IModel'S, udokumentowany tutaj

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: wiem, że to bardzo stary post, ale jest to pierwsza odpowiedź google i mam nadzieję, że będzie pomóc ludziom szukającym tej odpowiedzi w przyszłości.

+0

Po raz pierwszy widziałem to. Dlaczego?!! – Theyouthis

1

Przynajmniej jak z RabbitMQ 3.3.5, można to zrobić w programie C# bez biblioteki klienta RabbitMQ poprzez wywołanie API RabbitMQ Zarządzanie http:

// 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); 

Nazwa użytkownika i hasło są takie same jak te, służy do logowania do interfejsu użytkownika konsoli zarządzania RabbitMQ.

Odpowiedź będzie ciągiem JSON z listą kolejek, w tym ich liczba wiadomości, wśród innych właściwości. (Jeśli chcesz, możesz deserializowania że JSON do obiektu C# przy użyciu biblioteki takich jak Json.NET.)

Dokumentacja API jest instalowany wraz z konsolą zarządzania RabbitMQ i powinny być dostępne na tym serwerze w http://MY_RABBITMQ_SERVER:15672/api.

1

Mój mały fragment oparty na odpowiedzi Myydralls. Myślę, że gdyby miał kod w swojej odpowiedzi, mógłbym to zauważyć znacznie szybciej.

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