2012-03-26 20 views
12

Sto eseguendo il codice su python per inviare e ricevere dalla coda RabbitMQ da un'altra applicazione in cui non posso consentire il threading. Questa è una domanda da principianti, ma c'è la possibilità di controllare se c'è un messaggio e se non ce ne sono, basta semplicemente smettere di ascoltare? Come dovrei cambiare l'esempio di base "Hello world" per tale compito? Attualmente sono riuscito a smettere di consumare se ottengo un messaggio, ma se non ci sono messaggi il mio metodo receive() continua ad aspettare. Come forzarlo a non aspettare se non ci sono messaggi? O forse aspettare solo per un dato periodo di tempo?RabbitMQ consuma un messaggio se esiste e chiude

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

l'API rubino ha un metodo per controllare la lunghezza della coda .. hai controllato i documenti di pitone? –

risposta

15

Ok, ho trovato seguente soluzione:

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

Dovrebbe anche essere importante verificare se method_frame è None. Se non ci sono altri messaggi nella coda, channel.basic_get (queue = 'toM') ritornerà con None-s. – balas

Problemi correlati