python RabbitMQ订阅断联处理

1.链接RabbitMQ

import pika
# pika==1.2.1

parameters = pika.ConnectionParameters(
    host="host",
    port="port",
    virtual_host="virtual_host",
    credentials=pika.PlainCredentials(
        username="username",
        password="password"
    ),  # 用户名密码认证
    heartbeat=0  # 不检测心跳包
)
# 连接客户端
connection = pika.BlockingConnection(parameters=self.parameters)
# 频道
channel = self.connection.channel()

2.使用发布订阅模式接收数据

channel.queue_declare(queue="queue", durable=True, exclusive=True)
channel.queue_bind(exchange="amq.direct", queue="queue", routing_key="device")
channel.basic_consume(queue="device", on_message_callback=data_processing, auto_ack=True)
# data_processing为消息处理方法

3.开始订阅数据

channel.start_consuming()

在该模式下,如果长时间无广播数据(大约1小时左右),RabbitMQ链接会断开(外网情况下,RabbitMQ和python程序在同一台电脑没有测试过),哪怕把heartbeat设置为0(不检测心跳包),链接还是会断开。

解决方案:

pika模块没有直接发送心跳包的方法。

在开始订阅数据之前,新启一个线程,进行定时发送心跳包,发送间隔根据实际情况决定。

import time

heartbeat = threading.Thread(target=send_heartbeat, args=(connection,))
# 将heartbeat设置为守护线程
heartbeat.daemon = True
heartbeat.start()

def send_heartbeat(connection):
    while True:
        if connection is not None:
            try:
                # 发送心跳包
                connection._impl._send_frame(pika.frame.Heartbeat())
            except:
                pass
        time.sleep(60)

 

posted @ 2023-02-27 08:57  漂上岸的鱼  阅读(380)  评论(0)    收藏  举报