2012-03-26 5 views
12

スレッドを許可しない別のアプリケーションからRabbitMQキューから送受信するPythonでコードを実行しています。 これは非常に初心者向けの質問ですが、メッセージがあるかどうかをチェックし、聞こえていないものがないかどうかチェックする可能性はありますか?このようなタスクの基本的な "Hello world"の例をどのように変更すればよいですか?現在、私はメッセージを受け取ったら消費を止めることができましたが、メッセージがなければ私のメソッドはreceive()を待っています。メッセージがない場合、強制的にそれを待たないでください。または、指定された時間だけ待ちますか?RabbitMQが存在する場合に1つのメッセージを消費して終了する

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は、キューの長さをチェックするための方法を持っていますか? –

答えて

15

[OK]を、私は次の解決策が見つかりました:あなたはPythonのドキュメントをチェックして...

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

method_frameがNoneかどうかを確認することも重要です。キューにそれ以上のメッセージがない場合、channel.basic_get(queue = 'toM')はNone-sを返します。 – balas

関連する問題