- 集成Spring Integration MQTT与Eclipse Paho客户端 - 添加设备在线状态填充逻辑,支持批量查询心跳数据 - 优化Redis配置,使用Lazy初始化与通用序列化器 - 增加Redis异常处理与防重复提交Fail-Open机制 - 新增Redis设备模块常量与在线状态VO - 完善MQTT与Redis集群连接配置
65 lines
2.4 KiB
Java
65 lines
2.4 KiB
Java
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;
|
||
}
|
||
}
|