2012-03-26 18 views
12

Estoy ejecutando código en python para enviar y recibir desde la cola de RabbitMQ desde otra aplicación donde no puedo permitir el enhebrado. Esta es una pregunta muy nueva pero, ¿existe la posibilidad de simplemente verificar si hay un mensaje y si no hay ninguno, simplemente dejar de escuchar? ¿Cómo debería cambiar el ejemplo básico de "Hola mundo" para dicha tarea? Actualmente he logrado dejar de consumir si recibo un mensaje, pero si no hay mensajes, mi método receive() solo continúa esperando. ¿Cómo forzarlo a no esperar si no hay mensajes? ¿O tal vez esperar solo por una cantidad dada de tiempo?RabbitMQ consume un mensaje si existe y sale

import pika 

global answer 

def send(msg): 
    connection = pika.BlockingConnection(pika.ConnectionParameters()) 
    channel = connection.channel() 
    channel.queue_declare(queue='toJ') 
    channel.basic_publish(exchange='', routing_key='toJ', body=msg) 
    connection.close() 

def receive(): 
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) 
    channel = connection.channel() 
    channel.queue_declare(queue='toM') 
    channel.basic_consume(callback, queue='toM', no_ack=True) 
    global answer 
    return answer 

def callback(ch, method, properties, body): 
    ch.stop_consuming() 
    global answer 
    answer = body 
+0

la API de rubí tiene un método para comprobar la longitud de la cola .. ¿has comprobado la documentación de Python? –

Respuesta

15

Bueno, he encontrado la solución siguiente:

def receive(): 
    parameters = pika.ConnectionParameters(RabbitMQ_server) 
    connection = pika.BlockingConnection(parameters) 
    channel = connection.channel() 
    channel.queue_declare(queue='toM') 
    method_frame, header_frame, body = channel.basic_get(queue = 'toM')   
    if method_frame.NAME == 'Basic.GetEmpty': 
     connection.close() 
     return '' 
    else:    
     channel.basic_ack(delivery_tag=method_frame.delivery_tag) 
     connection.close() 
     return body 
+0

También debería ser importante comprobar si method_frame es None. Si no hay más mensajes en la cola, el channel.basic_get (queue = 'toM') volverá con None-s. – balas

Cuestiones relacionadas