feat(device): 添加MQTT设备在线状态管理与Redis容错机制

- 集成Spring Integration MQTT与Eclipse Paho客户端
- 添加设备在线状态填充逻辑,支持批量查询心跳数据
- 优化Redis配置,使用Lazy初始化与通用序列化器
- 增加Redis异常处理与防重复提交Fail-Open机制
- 新增Redis设备模块常量与在线状态VO
- 完善MQTT与Redis集群连接配置
This commit is contained in:
TongTongStudio
2026-08-08 20:31:29 +08:00
parent e5e3f2c741
commit 927332ad5d
23 changed files with 1368 additions and 14 deletions

View File

@@ -0,0 +1,64 @@
package com.youlai.boot.config;
import io.lettuce.core.ClientOptions;
import io.lettuce.core.SocketOptions;
import io.lettuce.core.resource.ClientResources;
import io.lettuce.core.resource.DefaultClientResources;
import io.lettuce.core.resource.Delay;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
/**
* Redis 健康检查与启动容错配置
* <p>
* 确保 Redis 不可用时程序仍能正常启动,并在 Redis 恢复后自动重连。
*
* @since 4.6.0
*/
@Slf4j
@Configuration
@ConditionalOnClass(RedisConnectionFactory.class)
public class RedisHealthConfig {
/**
* 自定义 Lettuce ClientResources增加优雅关闭和重连支持
*/
@Bean(destroyMethod = "shutdown")
@Primary
public ClientResources lettuceClientResources() {
DefaultClientResources resources = DefaultClientResources.builder()
.reconnectDelay(Delay.exponential(Duration.ofSeconds(2), Duration.ofSeconds(30), 2, TimeUnit.SECONDS))
.build();
log.info("Lettuce ClientResources 初始化完成,重连延迟: 2s");
return resources;
}
/**
* 自定义 ClientOptions配置断开重连策略
*/
@Bean
@Primary
public ClientOptions lettuceClientOptions() {
ClientOptions options = ClientOptions.builder()
.socketOptions(SocketOptions.builder()
.connectTimeout(Duration.ofSeconds(5)) // 连接超时 5 秒
.keepAlive(true) // 启用 TCP KeepAlive
.build())
// 断开后自动重连
.autoReconnect(true)
// 取消正在执行的命令超时(避免连接断开时命令永久挂起)
.cancelCommandsOnReconnectFailure(true)
// 连接断开时挂起的请求超时
.suspendReconnectOnProtocolFailure(true)
.build();
log.info("Lettuce ClientOptions 初始化完成autoReconnect=true");
return options;
}
}