|
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.mq.config;
|
|
|
|
|
|
import cn.hutool.system.SystemUtil;
|
|
|
import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
|
|
|
+import cn.iocoder.yudao.framework.mq.core.interceptor.RedisMessageInterceptor;
|
|
|
import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
|
|
|
import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
|
|
|
import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
|
|
@@ -9,7 +10,6 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
-import org.springframework.data.redis.connection.RedisConnectionFactory;
|
|
|
import org.springframework.data.redis.connection.stream.Consumer;
|
|
|
import org.springframework.data.redis.connection.stream.ObjectRecord;
|
|
|
import org.springframework.data.redis.connection.stream.ReadOffset;
|
|
@@ -33,8 +33,12 @@ import java.util.List;
|
|
|
public class YudaoMQAutoConfiguration {
|
|
|
|
|
|
@Bean
|
|
|
- public RedisMQTemplate redisMQTemplate(StringRedisTemplate stringRedisTemplate) {
|
|
|
- return new RedisMQTemplate(stringRedisTemplate);
|
|
|
+ public RedisMQTemplate redisMQTemplate(StringRedisTemplate redisTemplate,
|
|
|
+ List<RedisMessageInterceptor> interceptors) {
|
|
|
+ RedisMQTemplate redisMQTemplate = new RedisMQTemplate(redisTemplate);
|
|
|
+ // 添加拦截器
|
|
|
+ interceptors.forEach(redisMQTemplate::addInterceptor);
|
|
|
+ return redisMQTemplate;
|
|
|
}
|
|
|
|
|
|
// ========== 消费者相关 ==========
|
|
@@ -44,13 +48,14 @@ public class YudaoMQAutoConfiguration {
|
|
|
*/
|
|
|
@Bean
|
|
|
public RedisMessageListenerContainer redisMessageListenerContainer(
|
|
|
- RedisConnectionFactory factory, List<AbstractChannelMessageListener<?>> listeners) {
|
|
|
+ RedisMQTemplate redisMQTemplate, List<AbstractChannelMessageListener<?>> listeners) {
|
|
|
// 创建 RedisMessageListenerContainer 对象
|
|
|
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
|
|
|
// 设置 RedisConnection 工厂。
|
|
|
- container.setConnectionFactory(factory);
|
|
|
+ container.setConnectionFactory(redisMQTemplate.getRedisTemplate().getRequiredConnectionFactory());
|
|
|
// 添加监听器
|
|
|
listeners.forEach(listener -> {
|
|
|
+ listener.setRedisMQTemplate(redisMQTemplate);
|
|
|
container.addMessageListener(listener, new ChannelTopic(listener.getChannel()));
|
|
|
log.info("[redisMessageListenerContainer][注册 Channel({}) 对应的监听器({})]",
|
|
|
listener.getChannel(), listener.getClass().getName());
|
|
@@ -65,7 +70,8 @@ public class YudaoMQAutoConfiguration {
|
|
|
*/
|
|
|
@Bean(initMethod = "start", destroyMethod = "stop")
|
|
|
public StreamMessageListenerContainer<String, ObjectRecord<String, String>> redisStreamMessageListenerContainer(
|
|
|
- RedisTemplate<String, Object> redisTemplate, List<AbstractStreamMessageListener<?>> listeners) {
|
|
|
+ RedisMQTemplate redisMQTemplate, List<AbstractStreamMessageListener<?>> listeners) {
|
|
|
+ RedisTemplate<String, ?> redisTemplate = redisMQTemplate.getRedisTemplate();
|
|
|
// 第一步,创建 StreamMessageListenerContainer 容器
|
|
|
// 创建 options 配置
|
|
|
StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, ObjectRecord<String, String>> containerOptions =
|
|
@@ -74,8 +80,8 @@ public class YudaoMQAutoConfiguration {
|
|
|
.targetType(String.class) // 目标类型。统一使用 String,通过自己封装的 AbstractStreamMessageListener 去反序列化
|
|
|
.build();
|
|
|
// 创建 container 对象
|
|
|
- StreamMessageListenerContainer<String, ObjectRecord<String, String>> container = StreamMessageListenerContainer.create(
|
|
|
- redisTemplate.getRequiredConnectionFactory(), containerOptions);
|
|
|
+ StreamMessageListenerContainer<String, ObjectRecord<String, String>> container =
|
|
|
+ StreamMessageListenerContainer.create(redisTemplate.getRequiredConnectionFactory(), containerOptions);
|
|
|
|
|
|
// 第二步,注册监听器,消费对应的 Stream 主题
|
|
|
String consumerName = buildConsumerName();
|
|
@@ -85,7 +91,7 @@ public class YudaoMQAutoConfiguration {
|
|
|
redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup());
|
|
|
} catch (Exception ignore) {}
|
|
|
// 设置 listener 对应的 redisTemplate
|
|
|
- listener.setRedisTemplate(redisTemplate);
|
|
|
+ listener.setRedisMQTemplate(redisMQTemplate);
|
|
|
// 创建 Consumer 对象
|
|
|
Consumer consumer = Consumer.from(listener.getGroup(), consumerName);
|
|
|
// 设置 Consumer 消费进度,以最小消费进度为准
|