一旦RabbitMQ从另一个数据源接收到消息,我的python脚本就必须不断地向它发送消息。python脚本发送它们的频率可以变化,比如1分钟到30分钟。
以下是我如何建立与RabbitMQ的连接:
rabt_conn = pika.BlockingConnection(pika.ConnectionParameters("some_host"))
channel = rbt_conn.channel()
我只是有个例外
pika.exceptions.ConnectionClosed
我怎样才能重新连接到它?最好的方法是什么?有什么“策略”吗?是否可以发送ping以保持连接的活动性或设置超时?
任何指点都会很感激的。
RabbitMQ使用心跳来检测和关闭“死”连接,并防止网络设备(防火墙等)终止“空闲”连接。从版本3.5.5开始,默认超时设置为60秒(以前为~10分钟)。从docs:
Pika的阻塞连接的问题是,在进行某些API调用(例如,
channel.basic_publish()
,connection.sleep()
等)之前,它无法响应心跳。到目前为止我发现的方法是:
增加或取消超时
RabbitMQ在建立连接时与客户端协商超时。理论上,应该可以使用
heartbeat_interval
参数用更大的值覆盖服务器默认值,但是当前的Pika版本(0.10.0)在服务器和客户端提供的值之间使用min值。此问题已在当前的master上修复。另一方面,可以通过将
heartbeat_interval
参数设置为0
来完全停用heartbeat功能,这可能会使您陷入新问题(防火墙断开连接等)重新连接
扩展@itsafire的答案,您可以编写自己的publisher类,以便在需要时重新连接。一个简单的实现示例:
其他可能性
我还没有探索的其他可能性:
connection.sleep()
来响应服务器的心跳。非常简单:像这样的模式。
您可能需要重新考虑您的代码,但基本上是为了捕获异常、缓解问题并继续执行您的工作。
communication_handles
包含所有pika元素,如通道、队列以及您的东西需要通过pika与RabbitMQ通信的任何内容。相关问题 更多 >
编程相关推荐