Зачем использовать метод сна после вызова подписки в прослушивателе Python ActiveMQ с помощью STOMP

Я изучаю клиентский код ActiveMQ (потребитель), написанный на Python. Он использует протокол STOMP. Я не могу понять, почему мы вызываем методы sleep и disconnect после подписки на очередь назначения. Может ли кто-нибудь помочь мне понять реальный процесс, стоящий за кодом прослушивателя Python ниже.

Вопросы:

  1. Почему мы вызываем методы sleep и disconnect после вызова 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()
    

person udani    schedule 09.07.2019    source источник
comment
Сон не имеет ничего общего с самим ActiveMQ или stomp. Это просто сделано для того, чтобы пример программы не отключился сразу через x микросекунд после того, как вы создали подписку. После завершения выполнения программы они демонстрируют отключение, чтобы разорвать базовое соединение.   -  person chucksmash    schedule 09.07.2019
comment
Спасибо @chucksmash. Метод подписки отправляет упакованный кадр на сервер. Но что происходит после этого? Когда выполняется этот метод on_message()? Получает ли он несколько сообщений из очереди или только по одному?   -  person udani    schedule 09.07.2019
comment
Извините за задержку... это описание было действительно полезным... :)   -  person udani    schedule 12.08.2019


Ответы (1)


Здесь важно отметить, что экземпляр SampleListener, установленный на conn при вызове set_listener, будет вызываться асинхронно при поступлении сообщения в очередь. Другими словами, клиент не будет просто ждать/блокировать, пока не придет сообщение. Следовательно, необходимо вызвать sleep, чтобы потребитель некоторое время оставался в живых в ожидании сообщения. Если сообщение поступает в течение этого 10 секундного окна, то SampleListener получит его и напечатает сообщение (т. е. используя print(msg)). Если сообщение не поступает в очередь, то SampleListener не будет вызываться, и приложение просто завершится.

disconnect в конце — это просто хорошее управление ресурсами. Как правило, завершать работу приложения без очистки созданных им ресурсов (например, соединений) — плохая практика. Если disconnect не вызывается и приложение завершает работу, брокер будет вынужден в конечном итоге закрыть соединение и очистить все ресурсы на стороне сервера.

Если on_message займет более 10 секунд (т. е. продолжительность sleep), я не уверен, что произойдет. Рекомендую попробовать и посмотреть.

person Justin Bertram    schedule 09.07.2019
comment
Спасибо @Justin за объяснение. Это очень помогает. Но не могли бы вы объяснить поведение, если у нас нет метода разъединения, вызываемого после сна. У нас всего 10 секунд сна. Будет ли клиент слушать только 10 секунд и закончится? И если сообщение получено в течение 10 секунд, но процесс on_message занимает более 10 секунд, будет ли метод разъединения ждать завершения процесса? - person udani; 10.07.2019