允许RabbitMQ和Pika保持连接始终打开

时间:2019-05-27 08:47:53

标签: python rabbitmq pika rabbitmq-exchange

我有一个Python脚本,该脚本从流中读取内容,并在读取新字符串时将其内容(字符串)推送到RabbitMQ队列。

问题是流可能不会在1、2或9h左右发送消息,所以我希望 RabbitMQ连接始终保持打开状态

问题是当我创建连接和通道时:

self.connection = pika.BlockingConnection(pika.ConnectionParameters(host=self.host, credentials=self.credentials))
channel = self.connection.channel()
channel.exchange_declare(exchange=self.exchange_name, exchange_type='fanout')

...,如果一个小时后收到消息,我会收到此错误:

  File "/usr/local/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/var/opt/rabbitmq-agent.py", line 34, in push_to_queue
    raise Exception("Error sending the message to the queue: " + format(e))
Exception: Error sending the message to the queue: Send message to publisher error: Channel allocation requires an open connection: <SelectConnection CLOSED socket=None params=<ConnectionParameters host=x port=xvirtual_host=/ ssl=False>>

我想这是Rabbitmq服务器与客户端之间的连接已关闭。

如何避免这种情况?我想要一个“ ,请保持连接始终处于活动状态”。也许在Pika的连接参数中设置了超大心跳?像这样:

self.connection = pika.BlockingConnection(pika.ConnectionParameters(host=self.host, credentials=self.credentials, heartbeat=6000))

任何其他较凉爽的解决方案都将受到高度赞赏。

预先感谢

2 个答案:

答案 0 :(得分:0)

我建议您每次发送消息之前都要检查连接,如果连接已关闭,则只需重新连接即可。

if not self.connection or self.connection.is_closed:
    self.connection = pika.BlockingConnection(pika.ConnectionParameters(host=self.host, credentials=self.credentials))
    channel = self.connection.channel()
    channel.exchange_declare(exchange=self.exchange_name, exchange_type='fanout')

答案 1 :(得分:0)

您可以尝试将heartbeat添加到ConnectionParameters中。通过每指定秒发送一次心跳来创建少量流量。这将练习连接。一些防火墙或代理容易刮除空闲连接。甚至RabbitMQ在空闲的连接上都有超时。

import pika

# Set the connection parameters to connect to rabbit-server1 on port 5672
# on the / virtual host using the username "guest" and password "guest"
credentials = pika.PlainCredentials('guest', 'guest')
parameters = pika.ConnectionParameters('rabbit-server1',
                                       5672,
                                       '/',
                                       heartbeat=60,
                                       credentials)

有关pika文档,请参见here

此外,您还应该具有减轻网络断开连接的代码。这总是会发生并且会发生。因此,心跳的appart具有一些异常处理功能,可以以优美的方式重新打开关闭的连接。