feat(deps): 升级 Spring Boot 4.1.0 并迁移 Redis 监听到 @RedisListener

- spring-boot.version 4.0.6 -> 4.1.0
- 共享容器 Bean 改名为 redisMessageListenerContainer,适配 Boot 4.1 按名称回退的自动配置
- ClientDetailsInitRunner/DynamicRouteInitRunner 移除 InitializingBean 手工注册,改用 @RedisListener
- WxMpInitConfigRunner 移除自定义 redisContainer Bean,改用 @RedisListener
- 注意:需配合 Nacos 共享配置关闭 spring.cloud.compatibility-verifier(SC 2025.1.1 官方仅声明兼容 Boot 4.0.x)
This commit is contained in:
PIGCLOUD committed 2026-08-01 11:52:42 +08:00
1 parent bdeba4ce3d
commit 74fb06e3ea
5 files changed
+27 -46

No files matched your search

@@ -15,9 +15,15 @@ import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@Configuration(proxyBeanMethods = false)
public class RedisMessageConfiguration {
/**
* 共享 Redis 消息监听容器
* <p>
* Bean 名称必须为 redisMessageListenerContainer(Spring Data Redis 默认容器名): 1. Boot 4.1 的
* @RedisListener 自动配置按该名称回退,避免重复创建容器 2. @RedisListener 端点默认挂载到该名称的容器
*/
@Bean
@ConditionalOnMissingBean
public RedisMessageListenerContainer redisContainer(RedisConnectionFactory redisConnectionFactory) {
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
return container;
@@ -8,13 +8,11 @@ import com.pig4cloud.pigx.common.data.cache.RedisUtils;
import com.pig4cloud.pigx.common.data.tenant.TenantBroker;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.annotation.RedisListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.event.TransactionalEventListener;
@@ -29,12 +27,10 @@ import org.springframework.transaction.event.TransactionalEventListener;
@Service
@RequiredArgsConstructor
@SuppressWarnings("all")
public class ClientDetailsInitRunner implements InitializingBean {
public class ClientDetailsInitRunner {
private final SysOauthClientDetailsService clientDetailsService;
private final RedisMessageListenerContainer listenerContainer;
private final SysTenantService tenantService;
/**
@@ -83,14 +79,12 @@ public class ClientDetailsInitRunner implements InitializingBean {
}
/**
* redis 监听配置,监听 upms_redis_client_reload_topic,重新加载Redis
* redis 监听配置,监听 upms_redis_client_reload_topic,重新加载客户端配置
*/
@Override
public void afterPropertiesSet() throws Exception {
listenerContainer.addMessageListener((message, bytes) -> {
log.warn("接收到重新Redis 重新加载客户端配置事件");
initClientDetails();
}, new ChannelTopic(CacheConstants.CLIENT_REDIS_RELOAD_TOPIC));
@RedisListener(topic = CacheConstants.CLIENT_REDIS_RELOAD_TOPIC)
public void onClientReload(String message) {
log.warn("接收到 Redis 重新加载客户端配置事件");
initClientDetails();
}
}
@@ -25,7 +25,6 @@ import com.pig4cloud.pigx.common.gateway.support.DynamicRouteInitEvent;
import com.pig4cloud.pigx.common.gateway.vo.RouteDefinitionVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.cloud.gateway.filter.FilterDefinition;
@@ -33,10 +32,9 @@ import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.annotation.RedisListener;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.scheduling.annotation.Async;
import org.springframework.transaction.event.TransactionalEventListener;
@@ -54,14 +52,12 @@ import java.util.Map;
@RequiredArgsConstructor
@ConditionalOnDiscoveryEnabled
@SuppressWarnings("removal")
public class DynamicRouteInitRunner implements InitializingBean {
public class DynamicRouteInitRunner {
private final RedisTemplate<String, String> redisTemplate;
private final SysRouteConfService routeConfService;
private final RedisMessageListenerContainer listenerContainer;
/**
* ApplicationReadyEvent 使用 TransactionalEventListener 时启动时无法获取到事件
*/
@@ -105,14 +101,12 @@ public class DynamicRouteInitRunner implements InitializingBean {
}
/**
* redis 监听配置,监听 upms_redis_route_reload_topic,重新加载Redis
* redis 监听配置,监听 upms_redis_route_reload_topic,重新加载路由
*/
@Override
public void afterPropertiesSet() {
listenerContainer.addMessageListener((message, bytes) -> {
log.warn("接收到重新Redis 重新加载路由事件");
initRoute();
}, new ChannelTopic(CacheConstants.ROUTE_REDIS_RELOAD_TOPIC));
@RedisListener(topic = CacheConstants.ROUTE_REDIS_RELOAD_TOPIC)
public void onRouteReload(String message) {
log.warn("接收到 Redis 重新加载路由事件");
initRoute();
}
}
@@ -15,13 +15,10 @@ import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.constant.WxMpEventConstants;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.annotation.RedisListener;
import org.springframework.scheduling.annotation.Async;
import java.util.ArrayList;
@@ -283,23 +280,13 @@ public class WxMpInitConfigRunner {
}
/**
* 配置 Redis 消息监听容器
* <p>
* 监听 mp_redis_reload_topic 频道,当收到消息时重新加载公众号配置
* 适用场景:后台修改公众号配置后,通过发布 Redis 消息触发配置热更新
*
* @param redisConnectionFactory Redis 连接工厂
* @return Redis 消息监听容器
*/
@Bean
public RedisMessageListenerContainer redisContainer(RedisConnectionFactory redisConnectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
container.addMessageListener((message, bytes) -> {
log.warn("接收到重新加载公众号配置事件");
initServices();
}, new ChannelTopic(CacheConstants.MP_REDIS_RELOAD_TOPIC));
return container;
@RedisListener(topic = CacheConstants.MP_REDIS_RELOAD_TOPIC)
public void onMpConfigReload(String message) {
log.warn("接收到重新加载公众号配置事件");
initServices();
}
public static Map<String, Long> getTenants() {
+1 -1
View File
@@ -33,7 +33,7 @@
</organization>
<properties>
<spring-boot.version>4.0.6</spring-boot.version>
<spring-boot.version>4.1.0</spring-boot.version>
<spring-cloud.version>2025.1.1</spring-cloud.version>
<spring-cloud-alibaba.version>2025.1.0.0</spring-cloud-alibaba.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>