首页 > 解决方案 > 为什么在使用 STOMP 在 Python ActiveMQ 侦听器中调用订阅后使用睡眠方法

问题描述

我正在研究用 Python 编写的 ActiveMQ 客户端代码(消费者)。它使用 STOMP 协议。我无法理解为什么我们在订阅目标队列后调用sleep和方法。disconnect有人可以帮我理解下面python监听器代码背后的真实过程。

问题:

  1. 为什么我们在调用目标队列后调用一个sleepdisconnect方法?subscribing
  2. 它什么时候调用on_message()方法?

    import stomp
    import time
    
    class SampleListener(object):
      def on_message(self, headers, msg):
        print(msg)
    
    conn = stomp.Connection([('localhost',61613)]) 
    conn.set_listener('SampleListener', SampleListener()) 
    conn.start() 
    conn.connect() 
    conn.subscribe(destination='queue_name', id=1, ack='auto')
    time.sleep(10) # secs 
    conn.disconnect()
    

标签: python-3.xactivemqstomp

解决方案


这里要注意的主要是当消息到达队列时,调用时SampleListener设置的实例将被异步调用。换句话说,客户端不会简单地等待/阻塞,直到消息到达。因此,需要调用以使消费者保持活动状态等待消息。如果在第二个窗口期间有消息到达,那么将接收它并打印消息(即使用)。如果消息没有到达队列,则不会调用,应用程序将简单地终止。connset_listenersleep10SampleListenerprint(msg)SampleListener

最后disconnect只是良好的资源管理。一般而言,在不清理应用程序创建的资源(例如连接)的情况下终止应用程序是一种不好的做法。如果没有disconnect被调用并且应用程序终止,那么代理将被迫最终关闭连接本身并清理任何服务器端资源。

如果on_message需要超过 10 秒(即 的持续时间sleep),我不确定会发生什么。我建议你试试看。


推荐阅读