使用 stomp.py (3.0.5) 和 python (2.6) 以及 Apache ActiveMQ (5.5.1)。我已经让基本示例正常工作,但现在我想将收到的消息(在 on_message() 中)返回到 MyListener 类之外的变量。
我可以想象这是一项非常标准的任务,但我的一般 python 技能还不足以弄清楚如何去做。我已经在谷歌上搜索了一个更高级的示例并阅读了全局变量,但我似乎仍然无法将消息放入变量中,而不仅仅是将其打印到屏幕上。
任何帮助,非常感谢!
由于侦听器将在接收线程中调用,因此如果您想在其他线程(例如主线程)中处理消息,则应该进行线程切换。
线程切换的一个简单示例是使用具有锁定功能的共享变量,并在接收者线程接收到消息时更新该变量。并且,在另一个线程中读取该变量,但您需要使用适当的同步机制来确保您不会覆盖该消息,并且您不会遇到死锁。
这是使用一些带锁定的全局变量的示例代码。
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 类似问题的链接