Pregunta sobre amqp, message-queue, .net, rabbitmq – Compruebe el tamaño de la cola RabbitMQ del cliente

41

¿Alguien sabe si hay una manera de verificar la cantidad de mensajes en una cola RabbitMQ desde una aplicación cliente?

Estoy usando la biblioteca de cliente .NET.

Tu respuesta

8   la respuesta
5

parece que la implementación pika de queue_declare (..) ha cambiado desde la publicación muy útil de mmalone.

En python / pika (v0.9.5) todavía es posible verificar la profundidad de la cola a través de pika, pero requiere un enfoque un poco más indirecto.

queue_declare (...) pasa un objeto de método a su función de devolución de llamada, que luego puede inspeccionar. Por ejemplo, para verificar el número de mensajes y consumidores en la cola nombrada'myQueue':

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

Espero que esto ayude, y por favor, sea fácil, soy nuevo por aquí :-)

channel.queue_declare devuelve un objeto que contiene el recuento actual de mensajes, por lo que si desea evitar una devolución de llamada, también puede acceder al recuento de mensajes de esta manera: myChannel.method.message_count corford
9

verifique qué versión de la biblioteca de Cliente está utilizando.

Estoy usando el2.2.0 versión y tuve que usar BasicGet (cola, noAck).
En esta versión de la Biblioteca, QueueDeclare () solo devuelve una cadena que contiene el nombre de la cola.

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


Lo sé por la2.6.1 versión, QueueDeclare () devuelve un objeto de tipo QueueDeclareOk.

<code>QueueDeclareOk result = channel.QueueDeclare();
uint count = result.MessageCount;
</code>


Alternativamente, puede llamar desde la línea de comando:

<code><InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues
</code>

Y ves la siguiente salida:

Listado de colas ...
QueueName 1
...hecho.

HTH

10

pero lo busqué yo mismo y descubrí que rabbitmq le brinda u script simple para comunicarse con los nodos de Erlang ... está en la carpeta sbin donde se encuentra el script de inicio de RabbitMQ ... así que básicamente puede decir

<code>./rabbitmqctl list_queues
</code>

esto mostrará las colas junto con el recuento de mensajes pendientes para esas colas, de manera similar también puede decir

<code>./rabbitmqctl list_channels
./rabbitmqctl list_connections
</code>

Para más información puedes visitar.aquí

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

Edición: Sé que esta es una publicación muy antigua, pero es la primera respuesta de Google, y espero que ayude a las personas que buscan esta respuesta en el futuro.

Esta es la primera vez que he visto esto mencionado. ¡¡¿Porqué es eso?!! Theyouthis
2

puede hacer esto en un programa de C # sin ninguna biblioteca cliente de RabbitMQ llamando a la API HTTP de administración de RabbitMQ:

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

El nombre de usuario y la contraseña son los mismos que utiliza para iniciar sesión en la interfaz de usuario de la consola de administración de RabbitMQ.

La respuesta será una cadena JSON con la lista de colas, incluyendo sus recuentos de mensajes, entre otras propiedades. (Si lo desea, puede deserializar ese JSON en un objeto C # usando una biblioteca comoJson.NET.)

La documentación de la API se instala junto con la consola de administración RabbitMQ y debe estar disponible en ese servidor enhttp: // MY_RABBITMQ_SERVER: 15672 / api .

9

3.3.1 de la biblioteca de clientes .Net.

Uso lo siguiente, que es muy similar a la segunda sugerencia de Ralph Willgoss, pero puede proporcionar el nombre de la cola como argumento.

<code>QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;
</code>
65

aqueue_declare La operación RabbitMQ devuelve tres tuplas que contienen(<queue name>, <message count>, <consumer count>). lospassive el argumento de queue_declare le permite verificar si existe una cola sin modificar el estado del servidor. Así que puedes usarqueue_declare con elpassive Opción para verificar la longitud de la cola. No estoy seguro acerca de .NET, pero en Python se ve algo como esto:

<code>name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
</code>
Esta ya no es la mejor manera de hacerlo. Theyouthis
Esta debe ser la respuesta aceptada, incluso si se perdió la opción Basic.Get como la segunda fuente de esta información. Michael Dillon
@Theyouthis Es muy frustrante encontrar comentarios como "Esta ya no es la mejor manera de hacerlo" sin ningún tipo de referencia a la forma mejorada a la que se refiere. ¿Por qué no compartir sus hallazgos? spender
Use la función MessageCount () en su IModel. Si se desplaza hacia abajo, verá dos respuestas que mencionan la función en esta pregunta. Theyouthis
¿Qué es chan aquí y cómo importarlo? Kishan
5

tuviera un código en su respuesta, lo habría notado mucho más rápido.

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

Preguntas relacionadas