Stomp.py ответное сообщение от слушателя - PullRequest
4 голосов
/ 17 февраля 2012

Использование stomp.py (3.0.5) с python (2.6) вместе с Apache ActiveMQ (5.5.1). У меня есть простой пример , работающий без проблем, но теперь я хочу вернуть полученное сообщение (в on_message ()) в переменную вне класса MyListener.

Я могу себе представить, что это довольно стандартная задача, но мои общие навыки в Python недостаточно хороши, чтобы понять, как это сделать. Я просмотрел Google для более сложного примера и прочитал о глобальных переменных, но все еще не могу передать сообщение в переменную, а не просто распечатать его на экране.

Любая помощь, высоко ценится!

Ответы [ 2 ]

5 голосов
/ 11 апреля 2012

Поскольку слушатель будет вызываться в потоке получателя, вам следует выполнить передачу обслуживания потока, если вы хотите обработать сообщение в другом потоке (например, в основном потоке).

Один простой пример передачи обслуживания потокаиспользование совместно используемой переменной с блокировкой и обновление этой переменной при получении сообщения потоком получателя.И прочитайте эту переменную в другом потоке, но вам нужно использовать надлежащий механизм синхронизации, чтобы убедиться, что вы не переопределяете сообщение и не попадете в тупики.

Вот пример кода для использованиянекоторая глобальная переменная с блокировкой.

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()

Надеюсь, это поможет !!

2 голосов
/ 15 апреля 2014

Все, что вам нужно сделать, это небольшое изменение класса слушателя:

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 как вернуть сообщение от слушателя - ссылка на аналогичный вопрос stackoverflow

...