|
@@ -8,8 +8,11 @@ import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
|
|
import cn.iocoder.yudao.framework.mq.core.interceptor.RedisMessageInterceptor;
|
|
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.pubsub.AbstractChannelMessageListener;
|
|
import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
|
|
import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
|
|
|
|
+import cn.iocoder.yudao.framework.mq.job.RedisPendingMessageResendJob;
|
|
import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
|
|
import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.data.redis.connection.RedisServerCommands;
|
|
import org.springframework.data.redis.connection.RedisServerCommands;
|
|
@@ -24,7 +27,7 @@ import org.springframework.data.redis.listener.ChannelTopic;
|
|
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
|
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
|
import org.springframework.data.redis.stream.DefaultStreamMessageListenerContainerX;
|
|
import org.springframework.data.redis.stream.DefaultStreamMessageListenerContainerX;
|
|
import org.springframework.data.redis.stream.StreamMessageListenerContainer;
|
|
import org.springframework.data.redis.stream.StreamMessageListenerContainer;
|
|
-import org.springframework.scheduling.annotation.Async;
|
|
|
|
|
|
+import org.springframework.scheduling.annotation.EnableScheduling;
|
|
|
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Properties;
|
|
import java.util.Properties;
|
|
@@ -35,6 +38,7 @@ import java.util.Properties;
|
|
* @author 芋道源码
|
|
* @author 芋道源码
|
|
*/
|
|
*/
|
|
@Slf4j
|
|
@Slf4j
|
|
|
|
+@EnableScheduling // 启用定时任务,用于 RedisPendingMessageResendJob 重发消息
|
|
@AutoConfiguration(after = YudaoRedisAutoConfiguration.class)
|
|
@AutoConfiguration(after = YudaoRedisAutoConfiguration.class)
|
|
public class YudaoMQAutoConfiguration {
|
|
public class YudaoMQAutoConfiguration {
|
|
|
|
|
|
@@ -69,9 +73,20 @@ public class YudaoMQAutoConfiguration {
|
|
return container;
|
|
return container;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 创建 Redis Stream 重新消费的任务
|
|
|
|
+ */
|
|
|
|
+ @Bean
|
|
|
|
+ public RedisPendingMessageResendJob redisPendingMessageResendJob(List<AbstractStreamMessageListener<?>> listeners,
|
|
|
|
+ RedisMQTemplate redisTemplate,
|
|
|
|
+ @Value("${spring.application.name}") String groupName,
|
|
|
|
+ RedissonClient redissonClient) {
|
|
|
|
+ return new RedisPendingMessageResendJob(listeners, redisTemplate, groupName, redissonClient);
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 创建 Redis Stream 集群消费的容器
|
|
* 创建 Redis Stream 集群消费的容器
|
|
- *
|
|
|
|
|
|
+ * <p>
|
|
* Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html
|
|
* Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html
|
|
*/
|
|
*/
|
|
@Bean(initMethod = "start", destroyMethod = "stop")
|
|
@Bean(initMethod = "start", destroyMethod = "stop")
|
|
@@ -99,7 +114,8 @@ public class YudaoMQAutoConfiguration {
|
|
// 创建 listener 对应的消费者分组
|
|
// 创建 listener 对应的消费者分组
|
|
try {
|
|
try {
|
|
redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup());
|
|
redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup());
|
|
- } catch (Exception ignore) {}
|
|
|
|
|
|
+ } catch (Exception ignore) {
|
|
|
|
+ }
|
|
// 设置 listener 对应的 redisTemplate
|
|
// 设置 listener 对应的 redisTemplate
|
|
listener.setRedisMQTemplate(redisMQTemplate);
|
|
listener.setRedisMQTemplate(redisMQTemplate);
|
|
// 创建 Consumer 对象
|
|
// 创建 Consumer 对象
|