我有一个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))
任何其他较凉爽的解决方案都将受到高度赞赏。
预先感谢
答案 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具有一些异常处理功能,可以以优美的方式重新打开关闭的连接。