4

Apache ActiveMQ (5.5.1) と一緒に Python (2.6) で stomp.py (3.0.5) を使用します。基本的な例は問題なく動作しましたが、受信したメッセージ (on_message() 内) を MyListener クラスの外部の変数に返したいと考えています。

これはかなり標準的なタスクだと想像できますが、私の一般的な Python スキルは、その方法を理解するには十分ではありません。より高度な例を求めてグーグルをトロールし、グローバル変数について調べましたが、メッセージを画面に出力するだけでなく、変数にメッセージを入れることがまだできないようです。

どんな助けでも大歓迎です!

4

2 に答える 2

5

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

スレッドハンドオフの簡単な例の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()

お役に立てば幸いです!!

于 2012-04-11T08:45:57.803 に答える
3

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

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)

コードでは、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 リスナーからメッセージを返す方法- スタックオーバーフローの同様の質問へのリンク

于 2014-04-15T13:26:19.137 に答える