【问题标题】:Stomp.py return message from listenerStomp.py 从监听器返回消息
【发布时间】:2012-02-17 13:12:13
【问题描述】:

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

我可以想象这是一项非常标准的任务,但我的一般 Python 技能还不足以弄清楚如何去做。我在 google 上搜索了一个更高级的示例并阅读了全局变量,但我似乎仍然无法将消息放入变量中,而不仅仅是将其打印到屏幕上。

任何帮助,非常感谢!

【问题讨论】:

  • 你真的应该阅读Python tutorial。如果我知道这个 stomp.py 示例应该如何工作,我可以向您展示这是如何完成的,但如果您弄清楚如何做这样的基本事情可能会更好。
  • 我对python很熟悉,但显然缺乏一些具体的知识。我将阅读本教程,但简而言之 - on_message 函数是侦听器类的一部分,它正在侦听从 Java 消息服务器订阅的消息。该示例设置一个订阅者,然后发送一条消息 - 消息被 on_message 捕获,然后被打印...我只想能够从类中返回它而不是打印它...

标签: python stomp


【解决方案1】:

由于监听器将在接收线程中被调用,如果您想在其他线程(例如主线程)中处理消息,您应该进行线程切换。

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

这里是使用一些带锁定的全局变量的示例代码。

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

希望有帮助!!

【讨论】:

  • 这是错误的模式在当前版本的连接中断上不起作用。
【解决方案2】:

您所要做的就是稍微改变一下监听器类:

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 类似问题的链接

【讨论】:

  • 提供有关您分享的链接的更多信息,可能对其他人有用。
  • 这应该是评论,而不是答案。如果这是一个重复的问题,vote to close 就像这样,一旦你earn 足够了reputation
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多