Stomp.py 从监听器返回消息

4 投票
2 回答
10264 浏览
提问于 2025-04-17 13:10

我在用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()

希望这对你有帮助!!

撰写回答