为什么在使用 STOMP 调用 Python ActiveMQ 侦听器中的订阅后使用睡眠方法

Why use a sleep method after invoking the subscribe in Python ActiveMQ listener with STOMP

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

问题:

  1. 为什么我们在调用 subscribing 到目标队列后调用 sleepdisconnect 方法?
  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()
    

这里主要需要注意的是,调用set_listener时在conn上设置的SampleListener实例会在调用异步时被调用消息到达队列。换句话说,客户端不会简单地 wait/block 直到消息到达。因此,需要调用 sleep 以使消费者保持活动状态等待消息。如果消息在此 10 秒 window 期间到达,则 SampleListener 将接收它并打印消息(即使用 print(msg))。如果消息没有到达队列,则 SampleListener 不会被调用,应用程序将简单地终止。

最后的disconnect正好是很好的资源管理。通常,在不清理应用程序创建的资源(例如连接)的情况下终止应用程序是一种不好的做法。如果 disconnect 被调用并且应用程序终止,则代理将被迫最终关闭连接本身并清理所有 server-side 资源。

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