Commit 1819e0e1d6811e1170c6b5aa76dff598a6760e17
1 parent
c5b547e0
异步化 Redis MQ 的初始化,提升启动速度
Showing
2 changed files
with
9 additions
and
1 deletions
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/config/YudaoMQAutoConfiguration.java
| @@ -25,6 +25,7 @@ import org.springframework.data.redis.listener.ChannelTopic; | @@ -25,6 +25,7 @@ import org.springframework.data.redis.listener.ChannelTopic; | ||
| 25 | import org.springframework.data.redis.listener.RedisMessageListenerContainer; | 25 | import org.springframework.data.redis.listener.RedisMessageListenerContainer; |
| 26 | import org.springframework.data.redis.stream.DefaultStreamMessageListenerContainerX; | 26 | import org.springframework.data.redis.stream.DefaultStreamMessageListenerContainerX; |
| 27 | import org.springframework.data.redis.stream.StreamMessageListenerContainer; | 27 | import org.springframework.data.redis.stream.StreamMessageListenerContainer; |
| 28 | +import org.springframework.scheduling.annotation.Async; | ||
| 28 | 29 | ||
| 29 | import java.util.List; | 30 | import java.util.List; |
| 30 | import java.util.Properties; | 31 | import java.util.Properties; |
| @@ -54,6 +55,7 @@ public class YudaoMQAutoConfiguration { | @@ -54,6 +55,7 @@ public class YudaoMQAutoConfiguration { | ||
| 54 | * 创建 Redis Pub/Sub 广播消费的容器 | 55 | * 创建 Redis Pub/Sub 广播消费的容器 |
| 55 | */ | 56 | */ |
| 56 | @Bean | 57 | @Bean |
| 58 | + @Async // 异步化,可降低 2 秒左右的启动时间 | ||
| 57 | public RedisMessageListenerContainer redisMessageListenerContainer( | 59 | public RedisMessageListenerContainer redisMessageListenerContainer( |
| 58 | RedisMQTemplate redisMQTemplate, List<AbstractChannelMessageListener<?>> listeners) { | 60 | RedisMQTemplate redisMQTemplate, List<AbstractChannelMessageListener<?>> listeners) { |
| 59 | // 创建 RedisMessageListenerContainer 对象 | 61 | // 创建 RedisMessageListenerContainer 对象 |
| @@ -76,6 +78,7 @@ public class YudaoMQAutoConfiguration { | @@ -76,6 +78,7 @@ public class YudaoMQAutoConfiguration { | ||
| 76 | * Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html | 78 | * Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html |
| 77 | */ | 79 | */ |
| 78 | @Bean(initMethod = "start", destroyMethod = "stop") | 80 | @Bean(initMethod = "start", destroyMethod = "stop") |
| 81 | + @Async // 异步化,可降低 5 秒左右的启动时间 | ||
| 79 | public StreamMessageListenerContainer<String, ObjectRecord<String, String>> redisStreamMessageListenerContainer( | 82 | public StreamMessageListenerContainer<String, ObjectRecord<String, String>> redisStreamMessageListenerContainer( |
| 80 | RedisMQTemplate redisMQTemplate, List<AbstractStreamMessageListener<?>> listeners) { | 83 | RedisMQTemplate redisMQTemplate, List<AbstractStreamMessageListener<?>> listeners) { |
| 81 | RedisTemplate<String, ?> redisTemplate = redisMQTemplate.getRedisTemplate(); | 84 | RedisTemplate<String, ?> redisTemplate = redisMQTemplate.getRedisTemplate(); |
| @@ -95,6 +98,8 @@ public class YudaoMQAutoConfiguration { | @@ -95,6 +98,8 @@ public class YudaoMQAutoConfiguration { | ||
| 95 | // 第二步,注册监听器,消费对应的 Stream 主题 | 98 | // 第二步,注册监听器,消费对应的 Stream 主题 |
| 96 | String consumerName = buildConsumerName(); | 99 | String consumerName = buildConsumerName(); |
| 97 | listeners.parallelStream().forEach(listener -> { | 100 | listeners.parallelStream().forEach(listener -> { |
| 101 | + log.info("[redisStreamMessageListenerContainer][开始注册 StreamKey({}) 对应的监听器({})]", | ||
| 102 | + listener.getStreamKey(), listener.getClass().getName()); | ||
| 98 | // 创建 listener 对应的消费者分组 | 103 | // 创建 listener 对应的消费者分组 |
| 99 | try { | 104 | try { |
| 100 | redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup()); | 105 | redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup()); |
| @@ -111,6 +116,8 @@ public class YudaoMQAutoConfiguration { | @@ -111,6 +116,8 @@ public class YudaoMQAutoConfiguration { | ||
| 111 | .autoAcknowledge(false) // 不自动 ack | 116 | .autoAcknowledge(false) // 不自动 ack |
| 112 | .cancelOnError(throwable -> false); // 默认配置,发生异常就取消消费,显然不符合预期;因此,我们设置为 false | 117 | .cancelOnError(throwable -> false); // 默认配置,发生异常就取消消费,显然不符合预期;因此,我们设置为 false |
| 113 | container.register(builder.build(), listener); | 118 | container.register(builder.build(), listener); |
| 119 | + log.info("[redisStreamMessageListenerContainer][完成注册 StreamKey({}) 对应的监听器({})]", | ||
| 120 | + listener.getStreamKey(), listener.getClass().getName()); | ||
| 114 | }); | 121 | }); |
| 115 | return container; | 122 | return container; |
| 116 | } | 123 | } |
yudao-server/src/main/resources/application-local.yaml
| @@ -30,7 +30,7 @@ spring: | @@ -30,7 +30,7 @@ spring: | ||
| 30 | multi-statement-allow: true | 30 | multi-statement-allow: true |
| 31 | dynamic: # 多数据源配置 | 31 | dynamic: # 多数据源配置 |
| 32 | druid: # Druid 【连接池】相关的全局配置 | 32 | druid: # Druid 【连接池】相关的全局配置 |
| 33 | - initial-size: 5 # 初始连接数 | 33 | + initial-size: 1 # 初始连接数 |
| 34 | min-idle: 10 # 最小连接池数量 | 34 | min-idle: 10 # 最小连接池数量 |
| 35 | max-active: 20 # 最大连接池数量 | 35 | max-active: 20 # 最大连接池数量 |
| 36 | max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 | 36 | max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 |
| @@ -171,6 +171,7 @@ logging: | @@ -171,6 +171,7 @@ logging: | ||
| 171 | cn.iocoder.yudao.module.member.dal.mysql: debug | 171 | cn.iocoder.yudao.module.member.dal.mysql: debug |
| 172 | cn.iocoder.yudao.module.trade.dal.mysql: debug | 172 | cn.iocoder.yudao.module.trade.dal.mysql: debug |
| 173 | cn.iocoder.yudao.module.promotion.dal.mysql: debug | 173 | cn.iocoder.yudao.module.promotion.dal.mysql: debug |
| 174 | +debug: false | ||
| 174 | 175 | ||
| 175 | --- #################### 微信公众号、小程序相关配置 #################### | 176 | --- #################### 微信公众号、小程序相关配置 #################### |
| 176 | wx: | 177 | wx: |