Files
youlai-boot/src/main/java/com/youlai/boot/config/RedisHealthConfig.java
TongTongStudio 927332ad5d feat(device): 添加MQTT设备在线状态管理与Redis容错机制
- 集成Spring Integration MQTT与Eclipse Paho客户端
- 添加设备在线状态填充逻辑,支持批量查询心跳数据
- 优化Redis配置,使用Lazy初始化与通用序列化器
- 增加Redis异常处理与防重复提交Fail-Open机制
- 新增Redis设备模块常量与在线状态VO
- 完善MQTT与Redis集群连接配置
2026-08-08 20:31:29 +08:00

65 lines
2.4 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}