feat(device): 添加MQTT设备在线状态管理与Redis容错机制
- 集成Spring Integration MQTT与Eclipse Paho客户端 - 添加设备在线状态填充逻辑,支持批量查询心跳数据 - 优化Redis配置,使用Lazy初始化与通用序列化器 - 增加Redis异常处理与防重复提交Fail-Open机制 - 新增Redis设备模块常量与在线状态VO - 完善MQTT与Redis集群连接配置
This commit is contained in:
64
src/main/java/com/youlai/boot/config/RedisHealthConfig.java
Normal file
64
src/main/java/com/youlai/boot/config/RedisHealthConfig.java
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user