2009-06-24 21 views

risposta

64

È possibile recuperarlo tramite il client. Quando si esegue un'operazione queue_declare, RabbitMQ restituisce una tre tupla contenente (<queue name>, <message count>, <consumer count>). L'argomento passive per queue_declare consente di verificare se esiste una coda senza modificare lo stato del server. Quindi puoi usare queue_declare con l'opzione passive per controllare la lunghezza della coda. Non sei sicuro di .NET, ma in Python sembra qualcosa di simile:

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

Questa dovrebbe essere la risposta accettata, anche se ha mancato Basic.Get come seconda fonte di queste informazioni. –

+1

Cos'è il chan qui e come importarlo? – Kishan

+0

Questo non è più il modo migliore per farlo. – Theyouthis

10

I am 2 anni di ritardo, ma ero alla ricerca di me stesso e ho trovato che RabbitMQ u dà semplice script per comunicare ai nodi Erlang .. la sua nella cartella sbin in cui lo script di partenza per RabbitMQ è located..so si può sostanzialmente dire

./rabbitmqctl list_queues 

questo visualizzerà le code lungo con il conteggio dei messaggi in sospeso per queste code Allo stesso modo si può anche dire

./rabbitmqctl list_channels 
./rabbitmqctl list_connections 

ecc Per maggiori informazioni si può visitare here

5

Aggiornamento: sembra che l'attuazione di Pika queue_declare (..) è cambiato da molto utile post di mmalone.

In python/pika (v0.9.5) è ancora possibile controllare la profondità della coda tramite pika, ma richiede un approccio leggermente più indiretto.

queue_declare (...) passa un oggetto metodo nella sua funzione di richiamata, che è possibile esaminare. Ad esempio, per controllare il numero di messaggi e dei consumatori nella coda di nome '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) 

Spero che questo aiuti, e vi prego di andarci piano con me, io sono nuovo da queste parti :-)

+0

channel.queue_declare restituisce un oggetto che contiene il numero di messaggi corrente, quindi se si desidera evitare una richiamata, è anche possibile accedere al conteggio dei messaggi in questo modo: myChannel.method.message_count – corford

10

Se volevo farlo in .Net, controlla quale versione della libreria Client stai usando.

Sto usando la versione 2.2.0 e ho dovuto utilizzare BasicGet (queue, noAck).
In questa versione della libreria, QueueDeclare() restituisce solo una stringa contenente il nome della coda.

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


So dalla versione 2.6.1 , QueueDeclare() restituisce un oggetto di tipo QueueDeclareOk.

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


In alternativa, è possibile chiamare da linea di comando:

<InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues 

e si vede il seguente output:

Listing code ...
QueueName 1
. ..fatto.

HTH

6

Sto utilizzando la versione 3.3.1 della Biblioteca client .NET.

Io uso il seguente, che è molto simile al secondo suggerimento di Ralph Willgoss ma è possibile fornire il nome della coda come argomento.

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

È possibile utilizzare il metodo MessageCount del IModel, documentato qui

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: So che questo è un post molto vecchio, ma è la prima risposta di Google, e spero lo farà aiutare le persone a cercare questa risposta in futuro.

+0

Questa è la prima volta che ho visto questo menzionato. Perché?!! – Theyouthis

1

Almeno a partire dal RabbitMQ 3.3.5, si può fare questo in un programma C# senza libreria client RabbitMQ chiamando l'API di gestione RabbitMQ 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); 

Il nome utente e la password sono gli stessi di quelli si utilizza per accedere all'interfaccia utente della console di gestione RabbitMQ.

La risposta sarà una stringa JSON con l'elenco di code, incluso il conteggio dei messaggi, tra le altre proprietà. (Se si desidera, è possibile deserializzare che JSON in un oggetto C# utilizzando una libreria come Json.NET.)

La documentazione API viene installato insieme alla console di gestione RabbitMQ e dovrebbe essere disponibile sul server a http://MY_RABBITMQ_SERVER:15672/api.

1

il mio piccolo frammento basato sulla risposta di Myydrralls. Penso che se avesse il codice nella sua risposta avrei potuto notarlo molto più velocemente.

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