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)

浙公网安备 33010602011771号