Qpid Proton Python: не восстанавливать соединение после долгой работы - PullRequest
2 голосов
/ 26 марта 2020

Я использую Qpid Proton Python для потребителя AMQP, который запускает задания, которые могут длиться в течение +1 минуты.

После выполнения задания я получаю connection_closed с Condition('amqp:resource-limit-exceeded', 'local-idle-timeout expired').

Я понимаю, что это происходит потому, что моя работа по блокировке предотвращает сердцебиение.

Меня удивляет то, что я не соединяюсь. Отлаживая протон, я получаю эту строку кода , где self.connection.state имеет значение 36 , поэтому self.connection.state & Endpoint.LOCAL_ACTIVE возвращает 0.

  1. Почему в том, что? Могу ли я сделать что-нибудь, чтобы включить переподключение?
  2. Можно ли что-нибудь сделать на стороне клиента, чтобы избежать отключения в первую очередь?

вот рабочий код для воспроизведения сценария:

from __future__ import print_function

from time import sleep

from proton.handlers import MessagingHandler
from proton.reactor import Container


class ExampleConsumer(MessagingHandler):
    def __init__(self, queue):
        super().__init__(2, False)
        self.queue = queue

    def on_start(self, event):
        self.container = event.container
        self.conn = event.container.connect(url='localhost:5672')
        self.receiver = event.container.create_receiver(self.conn, self.queue)
        print('listening for new messages on /' + self.queue)

    def on_message(self, event):
        print('sleeping 60')
        sleep(60)
        print('done sleeping')
        self.accept(event.delivery)

    def on_connection_error(self, event):
        print('connection_error', event.connection.condition, event.connection.remote_condition)


try:
    Container(ExampleConsumer('examples')).run()
except KeyboardInterrupt: pass
...