首页 > 解决方案 > Qpid Proton Python:长时间工作后未重新连接

问题描述

我正在将 Qpid Proton Python 用于 AMQP 消费者,该消费者运行可以持续 +1 分钟的作业。

工作完成后,我得到一个connection_closedwith 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

标签: pythonactivemqamqpqpid

解决方案


推荐阅读