Stomp.py从listen返回消息

2024-03-28 11:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

使用stomp.py(3.0.5)和python(2.6)以及Apache ActiveMQ(5.5.1)。我让basic example正常工作,但现在我想将接收到的消息(in on_message())返回到MyListener类之外的变量。

我可以想象这是一个相当标准的任务,但是我的一般python技能还不足以解决如何完成它。我在google上搜索了一个更高级的例子,并阅读了全局变量,但我似乎仍然无法将消息转换成变量,而不仅仅是将其打印到屏幕上。

任何帮助,非常感谢!


Tags: inpy消息message标准basiconexample
2条回答

您所要做的就是对listener类进行一点小小的更改:

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 how to return message from listener-指向stackoverflow类似问题的链接

由于侦听器将在接收方线程中调用,因此如果要在其他线程(例如主线程)中处理消息,则应执行线程切换。

线程切换的一个简单示例是使用一个共享变量,当接收线程接收到消息时锁定并更新该变量。并且,在另一个线程中读取该变量,但您需要使用正确的同步机制,以确保不重写消息,并且不会遇到死锁。

下面的示例代码使用一些带锁的全局变量。

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

希望能帮上忙!!

相关问题 更多 >