From 74fb06e3ea192c9daf0ae8a22ba7285071dc9953 Mon Sep 17 00:00:00 2001 From: PIGCLOUD Date: Thu, 11 Jun 2026 10:44:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(deps):=20=E5=8D=87=E7=BA=A7=20Spring=20Boo?= =?UTF-8?q?t=204.1.0=20=E5=B9=B6=E8=BF=81=E7=A7=BB=20Redis=20=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E5=88=B0=20@RedisListener?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- .../data/cache/RedisMessageConfiguration.java | 8 ++++++- .../admin/config/ClientDetailsInitRunner.java | 20 ++++++---------- .../admin/config/DynamicRouteInitRunner.java | 20 ++++++---------- .../pigx/mp/config/WxMpInitConfigRunner.java | 23 ++++--------------- pom.xml | 2 +- 5 files changed, 27 insertions(+), 46 deletions(-) diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisMessageConfiguration.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisMessageConfiguration.java index 4ccdde416..62e290220 100644 --- a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisMessageConfiguration.java +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisMessageConfiguration.java @@ -15,9 +15,15 @@ import org.springframework.data.redis.listener.RedisMessageListenerContainer; @Configuration(proxyBeanMethods = false) public class RedisMessageConfiguration { + /** + * 共享 Redis 消息监听容器 + *

+ * 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; diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/ClientDetailsInitRunner.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/ClientDetailsInitRunner.java index c6cbee01b..fa90462d1 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/ClientDetailsInitRunner.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/ClientDetailsInitRunner.java @@ -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(); } } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java index af83bdce6..a00e6804e 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java @@ -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 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(); } } diff --git a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/config/WxMpInitConfigRunner.java b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/config/WxMpInitConfigRunner.java index 458e5334a..2967ccad4 100644 --- a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/config/WxMpInitConfigRunner.java +++ b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/config/WxMpInitConfigRunner.java @@ -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 消息监听容器 - *

* 监听 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 getTenants() { diff --git a/pom.xml b/pom.xml index 69fa9ac8b..a50351620 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ - 4.0.6 + 4.1.0 2025.1.1 2025.1.0.0 UTF-8