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

2024-05-17 13:18:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

问题是流可能不会在1、2或9小时内发送消息,所以我希望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')

。。。如果一小时后有消息到达,我会得到这个错误:

^{pr2}$

我认为rabbitmq服务器和客户机之间的连接已经关闭。在

我怎样才能避免这种情况?我想要一个“请保持连接始终有效”。也许在Pika的连接参数中设置了一个超大的心跳?像这样:

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

如果有其他更酷的解决方案,我们将不胜感激。在

提前谢谢


Tags: 字符串self脚本host消息内容exchangechannel
2条回答

您可以尝试将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)

请参见here获取pika文档。在

此外,您应该有适当的代码,以减轻网络断开。这种事总是会发生而且会发生的。因此,来自heartbeat的appart有一些异常处理准备以一种优雅的方式重新打开关闭的连接。在

我建议你每次发送消息前都要检查连接,如果连接被关闭,那么只需重新连接。在

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')

相关问题 更多 >