From dee84cfe54d30ce53c0532a2894aca4f2788f90c Mon Sep 17 00:00:00 2001 From: xce Date: Fri, 16 Jan 2026 18:44:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=97=A7=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/agri/framework/config/MqttConfig.java | 12 +++++++++--- .../framework/interceptor/MqttMessageHandler.java | 6 ++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/agri-framework/src/main/java/com/agri/framework/config/MqttConfig.java b/agri-framework/src/main/java/com/agri/framework/config/MqttConfig.java index c444402..6baff0c 100644 --- a/agri-framework/src/main/java/com/agri/framework/config/MqttConfig.java +++ b/agri-framework/src/main/java/com/agri/framework/config/MqttConfig.java @@ -218,11 +218,17 @@ public class MqttConfig { // 新增:应用关闭时优雅断开MQTT连接,避免连接泄漏(JDK 8兼容) @PreDestroy public void destroyMqttClient() { - if (mqttClientInstance != null && mqttClientInstance.isConnected()) { + // 最小改动:补充判空+close+置空,保留原有逻辑和注释 + if (mqttClientInstance != null) { try { - mqttClientInstance.disconnect(); + if (mqttClientInstance.isConnected()) { + mqttClientInstance.disconnect(); + log.info("【MQTT连接关闭】客户端已优雅断开连接"); + } + // 新增:关闭实例释放资源 mqttClientInstance.close(); - log.info("【MQTT连接关闭】客户端已优雅断开连接"); + // 新增:置空实例加速GC + mqttClientInstance = null; } catch (MqttException e) { log.error("【MQTT连接关闭异常】:" + e.getMessage(), e); } diff --git a/agri-framework/src/main/java/com/agri/framework/interceptor/MqttMessageHandler.java b/agri-framework/src/main/java/com/agri/framework/interceptor/MqttMessageHandler.java index 396ae47..0b20ffb 100644 --- a/agri-framework/src/main/java/com/agri/framework/interceptor/MqttMessageHandler.java +++ b/agri-framework/src/main/java/com/agri/framework/interceptor/MqttMessageHandler.java @@ -448,14 +448,16 @@ public class MqttMessageHandler implements SmartLifecycle { currentReconnectCount++; log.info("【MQTT重连】第{}次尝试重连(间隔{}秒)", currentReconnectCount, reconnectInterval); - // 兼容极端场景:先强制断开(无论当前状态),再重新连接 + // 最小改动:补充close+置空,彻底释放旧实例 try { if (mqttClient.isConnected()) { mqttClient.disconnect(); log.info("【MQTT重连】已断开旧连接"); } + // 新增:关闭旧实例释放资源 + mqttClient.close(); } catch (Exception e) { - log.warn("【MQTT重连】断开旧连接失败(忽略):{}", e.getMessage()); + log.warn("【MQTT重连】断开/关闭旧连接失败(忽略):{}", e.getMessage()); } // 2. 生成新的clientId(和MqttConfig中一致的规则:原clientId + 随机后缀)