2012-02-17 11 views
2

Apache ActiveMQ(5.5.1)の横にpython(2.6)とともにstomp.py(3.0.5)を使用します。 basic exampleは問題なく動作しますが、受信したメッセージ(on_message()内)をMyListenerクラスの外部の変数に戻したいと思います。リスナーからのStomp.pyメッセージの返信

これはかなり標準的な作業だと思いますが、私の一般的なPythonのスキルは、それを行う方法を理解するのに十分ではありません。私はより高度な例についてはgoogleをtrawledして、グローバル変数を読んでいますが、画面に印刷するのではなく、変数にメッセージを受け取っているようには思えません。

大変助かりました!

+0

[Pythonチュートリアル](http://docs.python.org/tutorial/)を実際に読んでください。この「stomp.py」の例がどのように動作するのか分かっていたら、これがどのように行われるのかを見せてもらえますが、このような基本的なことをどうやって行うのが良いか分かります。 –

+0

私はかなりPythonに精通していますが、明らかに特定の知識が不足しています。このチュートリアルを読んでみましょうが、要するにon_message関数は、Java Messaging Serverから購読されているメッセージをリスンするリスナークラスの一部です。この例では、サブスクライバを設定してメッセージを送信します。メッセージはon_messageによってキャッチされ、印刷されます。クラスを印刷するのではなく、クラスから返すことができます。 – robrant

答えて

4

リスナーは受信側スレッドで呼び出されるため、他のスレッド(メインスレッドなど)でメッセージを処理する場合は、スレッドのハンドオフを行う必要があります。

スレッドハンドオフの簡単な例の1つは、受信者スレッドがメッセージを受信したときに変数をロックして更新する共有変数を使用することです。そして、その変数を他のスレッドで読み込みますが、メッセージをオーバーライドしないように適切な同期メカニズムを使用する必要があり、デッドロックが発生しません。

ロックでグローバル変数を使用するサンプルコードを次に示します。

rcvd_msg = None 
lock = thread.Condition() 

# executed in the main thread 
with lock: 
    while rcvd_msg == None: 
     lock.wait() 
    # read rcvd_msg 
    rcvd_msg = None 
    lock.notifyAll() 

class Listener(ConnectionListener):  

    def on_message(self, headers, message): 
     # executed in the receiver thread 
     global rcvd_msg, lock 
     with lock: 
      while rcvd_msg != None: 
       lock.wait() 
      rcvd_msg = message 
      lock.notifyAll() 

希望がある!

+0

パターンが間違っています現在のバージョンでは接続ブレークでは機能しません。 – Chameleon

2

あなたがしなければならないのは、リスナークラスのわずかな変化である:

class MyListener(object): 
    msg_list = [] 

    def __init__(self): 
     self.msg_list = [] 

    def on_error(self, headers, message): 
     self.msg_list.append('(ERROR) ' + message) 

    def on_message(self, headers, message): 
     self.msg_list.append(message) 

、Uはstomp.pyを使用するコード、中:

conn = stomp.Connection() 
lst = MyListener() 
conn.set_listener('', lst) 
conn.start() 
conn.connect() 
conn.subscribe(destination='/queue/test', id=1, ack='auto') 
time.sleep(2) 
messages = lst.msg_list 
conn.disconnect() 
return render(request, 'template.html', {'messages': messages}) 

Stomp.py how to return message from listener - へのリンク同様の質問

+0

あなたが共有するリンクについてのより多くの情報を他の人に役立つかもしれません。 –

+0

これはコメントであり、答えではありません。それが重複した質問であれば、あなたは[得る](http://meter.stackexchange.com/q/146472)のように[vote to close](http://stackoverflow.com/help/privileges/close-questions)/169503)十分な[評判](http://stackoverflow.com/help/whats-reputation)。 –

関連する問題