2011-11-19 8 views

Respuesta

6

Hay dos formas de obtener el tamaño de cola en el protocolo AMQP. Puede usar Queue.Declare o Basic.Get.

Si está consumiendo mensajes a medida que llegan utilizando Basic.Consume, no podrá obtener esta información a menos que se desconecte (timeout) y redeclare la cola, o bien reciba un mensaje pero no lo reproduzca. En las versiones más recientes de AMQP, puede volver a colocar el mensaje de manera activa.

En cuanto a Pika, no sé los detalles, pero los clientes de Python para AMQP han sido una espina en mi costado. A menudo necesitará monopatch clases para obtener la información que necesita, o para permitir que un cliente de cola exceder el tiempo de espera para que pueda hacer otras cosas a intervalos periódicos como estadísticas de registro o averiguar cuántos mensajes están en una cola.

Otra forma de evitar esto es abandonar y utilizar la clase Pipe para ejecutar sudo rabbitmqctl list_queues -p my_vhost. Luego analice la salida para encontrar el tamaño de todas las colas. Si hace esto, necesitará configurar /etc/sudoers para no solicitar la contraseña de sudo habitual.

Rezo para que alguien más con más experiencia en Pika responda esto señalando cómo puedes hacer todas las cosas que mencioné, en cuyo caso descargaré Pika y patearé los neumáticos. Pero si eso no sucede y estás teniendo problemas con el mapeo del código de Pika, eche un vistazo al haigha. Descubrí que su código es mucho más sencillo que otras bibliotecas cliente de Python AMQP porque se adhieren al protocolo AMQP.

+0

Gracias por sudo rabbitmqctl list_queues -p my_vhost truco, voy a intentar eso. – Sebastian

6

¿Has probado PyRabbit? Tiene un get_queue_depth()method que suena como lo que estás buscando.

+1

No sabía PyRabbit. Parece prometedor, lo intentaré! – Sebastian

28

Sé que esta pregunta es un poco antigua, pero he aquí un ejemplo de cómo hacer esto con pika.

Con respecto a AMQP y RabbitMQ, si ya ha declarado la cola, puede volver a declarar la cola con el passive flag encendido y manteniendo idénticos todos los demás parámetros de la cola. La respuesta a esta declaración declare-ok incluirá la cantidad de mensajes en la cola.

Aquí es un ejemplo 0.9.5 Con pika:

import pika 

def on_callback(msg): 
    print msg 

params = pika.ConnectionParameters(
     host='localhost', 
     port=5672, 
     credentials=pika.credentials.PlainCredentials('guest', 'guest'), 
    ) 

# Open a connection to RabbitMQ on localhost using all default parameters 
connection = pika.BlockingConnection(parameters=params) 

# Open the channel 
channel = connection.channel() 

# Declare the queue 
channel.queue_declare(
     callback=on_callback, 
     queue="test", 
     durable=True, 
     exclusive=False, 
     auto_delete=False 
    ) 

# ... 

# Re-declare the queue with passive flag 
res = channel.queue_declare(
     callback=on_callback, 
     queue="test", 
     durable=True, 
     exclusive=False, 
     auto_delete=False, 
     passive=True 
    ) 
print 'Messages in queue %d' % res.method.message_count 

Esto imprimirá el siguiente:

<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])> 
<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])> 
Messages in queue 0 

le proporcionará el número de mensajes del miembro de message_count.

+1

Muchas gracias. Tu respuesta me ayudó. – Evgeniy

9

Aquí se muestra cómo puede obtener la longitud de la cola utilizando pika (Teniendo en cuenta que está utilizando el usuario y contraseña predeterminados en el host local) reemplace q_name por el nombre de su cola.

import pika 
connection = pika.BlockingConnection() 
channel = connection.channel() 
q = channel.queue_declare(q_name) 
q_len = q.method.message_count 
Cuestiones relacionadas