Stomp.py 从监听器返回消息
我在用stomp.py(3.0.5)和Python(2.6)配合Apache ActiveMQ(5.5.1)进行开发。我已经成功运行了基本示例,没有遇到任何问题,但现在我想把在on_message()中收到的消息返回到MyListener类外面的一个变量里。
我觉得这应该是个很常见的任务,但我的Python基础不太好,搞不清楚该怎么做。我在网上找了很多更高级的例子,也了解了一些全局变量的知识,但我还是无法把消息放进一个变量里,而不是仅仅打印到屏幕上。
任何帮助都会非常感激!
2 个回答
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 如何从监听器返回消息 - 这是一个类似问题的链接,来自 StackOverflow
5
因为监听器会在接收线程中被调用,所以如果你想在其他线程(比如主线程)中处理消息,就需要进行线程交接。
一个简单的线程交接方法是使用一个共享变量,并加锁。当接收线程收到消息时,就更新这个共享变量。而在其他线程中读取这个变量时,你需要使用合适的同步机制,以确保不会覆盖消息,也不会出现死锁的情况。
下面是一个使用全局变量和加锁的示例代码。
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()
希望这对你有帮助!!