Вопрос

Используя Stomp.py (3.0.5) с Python (2.6) вместе с Apache Activemq (5.5.1). У меня есть Основной пример Работая без каких -либо проблем, но теперь я хочу вернуть полученное сообщение (in_message ()) в переменную за пределами класса MyListener.

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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 аналогичный вопрос

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top