2012-03-26 16 views
12

Uruchomiłem kod na pythonie, aby wysyłać i odbierać z kolejki RabbitMQ z innej aplikacji, w której nie mogę zezwolić na wątkowanie. To jest pytanie dla początkujących, ale czy istnieje możliwość sprawdzenia, czy jest wiadomość, a jeśli nie ma żadnych, to po prostu przestań słuchać? Jak mam zmienić podstawowy przykład "Hello world" dla tego zadania? Obecnie udało mi się przestać konsumować, gdy otrzymam wiadomość, ale jeśli nie ma wiadomości, którą moja metoda otrzyma(), po prostu dalej czekam. Jak zmusić go, aby nie czekać, jeśli nie ma żadnych wiadomości? A może czekać tylko na określony czas?RabbitMQ zużywa jedną wiadomość, jeśli istnieje i kończę

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

API Ruby ma metodę, aby sprawdzić długość kolejki .. Czy można sprawdzić w dokumentacji Pythona? –

Odpowiedz

15

Ok, znalazłem następujące rozwiązanie:

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

Powinno być również ważne, aby sprawdzić, czy method_frame ma wartość None. Jeśli w kolejce nie ma dalszych komunikatów, kanał channel.basic_get (queue = 'toM') zwróci wartość None-s. – balas

Powiązane problemy