Commit 0b5662b6989b5ae053f441adc80b48ad14fe02f9

Authored by YunaiV
1 parent 8e6fa3db

项目结构调整 x 20 : 拆分出独立的 yudao-spring-boot-starter-mq 组件,整理更加清晰

Showing 41 changed files with 195 additions and 119 deletions
yudao-admin-server/pom.xml
@@ -65,6 +65,12 @@ @@ -65,6 +65,12 @@
65 <artifactId>yudao-spring-boot-starter-job</artifactId> 65 <artifactId>yudao-spring-boot-starter-job</artifactId>
66 </dependency> 66 </dependency>
67 67
  68 + <!-- 消息队列相关 -->
  69 + <dependency>
  70 + <groupId>cn.iocoder.boot</groupId>
  71 + <artifactId>yudao-spring-boot-starter-mq</artifactId>
  72 + </dependency>
  73 +
68 <!-- 服务保障相关 --> 74 <!-- 服务保障相关 -->
69 <dependency> 75 <dependency>
70 <groupId>cn.iocoder.boot</groupId> 76 <groupId>cn.iocoder.boot</groupId>
@@ -104,6 +110,10 @@ @@ -104,6 +110,10 @@
104 <groupId>cn.smallbun.screw</groupId> 110 <groupId>cn.smallbun.screw</groupId>
105 <artifactId>screw-core</artifactId> <!-- 实现数据库文档 --> 111 <artifactId>screw-core</artifactId> <!-- 实现数据库文档 -->
106 </dependency> 112 </dependency>
  113 + <dependency>
  114 + <groupId>cn.iocoder.boot</groupId>
  115 + <artifactId>yudao-spring-boot-starter-mq</artifactId>
  116 + </dependency>
107 117
108 </dependencies> 118 </dependencies>
109 119
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.infra.mq.consumer.config; 1 package cn.iocoder.yudao.adminserver.modules.infra.mq.consumer.config;
2 2
3 import cn.iocoder.yudao.framework.apollo.internals.DBConfigRepository; 3 import cn.iocoder.yudao.framework.apollo.internals.DBConfigRepository;
4 -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; 4 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
5 import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage; 5 import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage;
6 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
7 import org.springframework.stereotype.Component; 7 import org.springframework.stereotype.Component;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java
1 package cn.iocoder.yudao.adminserver.modules.infra.mq.message.config; 1 package cn.iocoder.yudao.adminserver.modules.infra.mq.message.config;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 /** 6 /**
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/config/InfConfigProducer.java
1 package cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config; 1 package cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils;  
4 import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage; 3 import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage;
  4 +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
5 import org.springframework.data.redis.core.StringRedisTemplate; 5 import org.springframework.data.redis.core.StringRedisTemplate;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
7 7
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.dept; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.dept;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage;
5 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; 5 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
6 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.dict; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.dict;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage;
5 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; 5 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService;
6 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/mail/SysMailSendConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.mail; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.mail;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.stream.AbstractStreamMessageListener; 3 +import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage;
5 import lombok.extern.slf4j.Slf4j; 5 import lombok.extern.slf4j.Slf4j;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage;
5 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; 5 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService;
6 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage;
5 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; 5 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
6 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage;
5 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; 5 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;
6 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage;
5 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService; 5 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService;
6 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.stream.AbstractStreamMessageListener; 3 +import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
5 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService; 5 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService;
6 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage;
5 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService; 5 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
6 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.dept; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.dept;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 /** 6 /**
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.dict; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.dict;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 /** 6 /**
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.mail; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.mail;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.stream.StreamMessage; 3 +import cn.iocoder.yudao.framework.mq.core.stream.StreamMessage;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 import javax.validation.constraints.NotNull; 6 import javax.validation.constraints.NotNull;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 /** 6 /**
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 /** 6 /**
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 /** 6 /**
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 /** 6 /**
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsSendMessage.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms;
2 2
3 import cn.iocoder.yudao.framework.common.core.KeyValue; 3 import cn.iocoder.yudao.framework.common.core.KeyValue;
4 -import cn.iocoder.yudao.framework.redis.core.stream.StreamMessage; 4 +import cn.iocoder.yudao.framework.mq.core.stream.StreamMessage;
5 import lombok.Data; 5 import lombok.Data;
6 6
7 import javax.validation.constraints.NotNull; 7 import javax.validation.constraints.NotNull;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 /** 6 /**
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dept/SysDeptProducer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; 3 +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage;
5 import org.springframework.data.redis.core.StringRedisTemplate; 5 import org.springframework.data.redis.core.StringRedisTemplate;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dict/SysDictDataProducer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; 3 +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage;
5 import org.springframework.data.redis.core.StringRedisTemplate; 5 import org.springframework.data.redis.core.StringRedisTemplate;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysMenuProducer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; 3 +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage;
5 import org.springframework.data.redis.core.StringRedisTemplate; 5 import org.springframework.data.redis.core.StringRedisTemplate;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysPermissionProducer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; 3 +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage;
5 import org.springframework.data.redis.core.StringRedisTemplate; 5 import org.springframework.data.redis.core.StringRedisTemplate;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysRoleProducer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; 3 +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage; 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage;
5 import org.springframework.data.redis.core.StringRedisTemplate; 5 import org.springframework.data.redis.core.StringRedisTemplate;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms;
2 2
3 import cn.iocoder.yudao.framework.common.core.KeyValue; 3 import cn.iocoder.yudao.framework.common.core.KeyValue;
4 -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; 4 +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
5 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage; 5 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage;
6 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; 6 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
7 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage; 7 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage;
yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java
@@ -6,7 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.mail.SysMailSendC @@ -6,7 +6,7 @@ import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.mail.SysMailSendC
6 import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms.SysSmsSendConsumer; 6 import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms.SysSmsSendConsumer;
7 import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage; 7 import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage;
8 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; 8 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
9 -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; 9 +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
10 import org.junit.jupiter.api.Disabled; 10 import org.junit.jupiter.api.Disabled;
11 import org.junit.jupiter.api.Test; 11 import org.junit.jupiter.api.Test;
12 import org.springframework.context.annotation.Import; 12 import org.springframework.context.annotation.Import;
yudao-dependencies/pom.xml
@@ -193,6 +193,13 @@ @@ -193,6 +193,13 @@
193 <version>${revision}</version> 193 <version>${revision}</version>
194 </dependency> 194 </dependency>
195 195
  196 + <!-- 消息队列相关 -->
  197 + <dependency>
  198 + <groupId>cn.iocoder.boot</groupId>
  199 + <artifactId>yudao-spring-boot-starter-mq</artifactId>
  200 + <version>${revision}</version>
  201 + </dependency>
  202 +
196 <!-- 服务保障相关 --> 203 <!-- 服务保障相关 -->
197 <dependency> 204 <dependency>
198 <groupId>cn.iocoder.boot</groupId> 205 <groupId>cn.iocoder.boot</groupId>
yudao-framework/pom.xml
@@ -15,12 +15,16 @@ @@ -15,12 +15,16 @@
15 <module>yudao-spring-boot-starter-redis</module> 15 <module>yudao-spring-boot-starter-redis</module>
16 <module>yudao-spring-boot-starter-web</module> 16 <module>yudao-spring-boot-starter-web</module>
17 <module>yudao-spring-boot-starter-security</module> 17 <module>yudao-spring-boot-starter-security</module>
  18 +
18 <module>yudao-spring-boot-starter-monitor</module> 19 <module>yudao-spring-boot-starter-monitor</module>
19 <module>yudao-spring-boot-starter-protection</module> 20 <module>yudao-spring-boot-starter-protection</module>
20 <module>yudao-spring-boot-starter-config</module> 21 <module>yudao-spring-boot-starter-config</module>
21 <module>yudao-spring-boot-starter-job</module> 22 <module>yudao-spring-boot-starter-job</module>
  23 + <module>yudao-spring-boot-starter-mq</module>
  24 +
22 <module>yudao-spring-boot-starter-excel</module> 25 <module>yudao-spring-boot-starter-excel</module>
23 <module>yudao-spring-boot-starter-test</module> 26 <module>yudao-spring-boot-starter-test</module>
  27 +
24 <module>yudao-spring-boot-starter-biz-operatelog</module> 28 <module>yudao-spring-boot-starter-biz-operatelog</module>
25 <module>yudao-spring-boot-starter-biz-dict</module> 29 <module>yudao-spring-boot-starter-biz-dict</module>
26 <module>yudao-spring-boot-starter-biz-sms</module> 30 <module>yudao-spring-boot-starter-biz-sms</module>
yudao-framework/yudao-spring-boot-starter-mq/pom.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0"
  3 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5 + <parent>
  6 + <groupId>cn.iocoder.boot</groupId>
  7 + <artifactId>yudao-framework</artifactId>
  8 + <version>${revision}</version>
  9 + </parent>
  10 + <modelVersion>4.0.0</modelVersion>
  11 + <artifactId>yudao-spring-boot-starter-mq</artifactId>
  12 + <packaging>jar</packaging>
  13 +
  14 + <name>${artifactId}</name>
  15 + <description>消息队列,基于 Redis Pub/Sub 实现广播消费,基于 Stream 实现集群消费</description>
  16 + <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
  17 +
  18 + <dependencies>
  19 + <!-- DB 相关 -->
  20 + <dependency>
  21 + <groupId>cn.iocoder.boot</groupId>
  22 + <artifactId>yudao-spring-boot-starter-redis</artifactId>
  23 + </dependency>
  24 + </dependencies>
  25 +
  26 +</project>
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/config/YudaoMQAutoConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.mq.config;
  2 +
  3 +import cn.hutool.system.SystemUtil;
  4 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
  5 +import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +import org.springframework.boot.autoconfigure.AutoConfigureAfter;
  8 +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
  9 +import org.springframework.context.annotation.Bean;
  10 +import org.springframework.context.annotation.Configuration;
  11 +import org.springframework.data.redis.connection.RedisConnectionFactory;
  12 +import org.springframework.data.redis.connection.stream.Consumer;
  13 +import org.springframework.data.redis.connection.stream.ObjectRecord;
  14 +import org.springframework.data.redis.connection.stream.ReadOffset;
  15 +import org.springframework.data.redis.connection.stream.StreamOffset;
  16 +import org.springframework.data.redis.core.RedisTemplate;
  17 +import org.springframework.data.redis.listener.ChannelTopic;
  18 +import org.springframework.data.redis.listener.RedisMessageListenerContainer;
  19 +import org.springframework.data.redis.stream.StreamMessageListenerContainer;
  20 +
  21 +import java.util.List;
  22 +
  23 +/**
  24 + * 消息队列配置类
  25 + *
  26 + * @author 芋道源码
  27 + */
  28 +@Configuration
  29 +@AutoConfigureAfter(YudaoMQAutoConfiguration.class)
  30 +@Slf4j
  31 +public class YudaoMQAutoConfiguration {
  32 +
  33 + /**
  34 + * 创建 Redis Pub/Sub 广播消费的容器
  35 + */
  36 + @Bean
  37 + public RedisMessageListenerContainer redisMessageListenerContainer(
  38 + RedisConnectionFactory factory, List<AbstractChannelMessageListener<?>> listeners) {
  39 + // 创建 RedisMessageListenerContainer 对象
  40 + RedisMessageListenerContainer container = new RedisMessageListenerContainer();
  41 + // 设置 RedisConnection 工厂。
  42 + container.setConnectionFactory(factory);
  43 + // 添加监听器
  44 + listeners.forEach(listener -> {
  45 + container.addMessageListener(listener, new ChannelTopic(listener.getChannel()));
  46 + log.info("[redisMessageListenerContainer][注册 Channel({}) 对应的监听器({})]",
  47 + listener.getChannel(), listener.getClass().getName());
  48 + });
  49 + return container;
  50 + }
  51 +
  52 + /**
  53 + * 创建 Redis Stream 集群消费的容器
  54 + *
  55 + * Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html
  56 + */
  57 + @Bean(initMethod = "start", destroyMethod = "stop")
  58 + public StreamMessageListenerContainer<String, ObjectRecord<String, String>> redisStreamMessageListenerContainer(
  59 + RedisTemplate<String, Object> redisTemplate, List<AbstractStreamMessageListener<?>> listeners) {
  60 + // 第一步,创建 StreamMessageListenerContainer 容器
  61 + // 创建 options 配置
  62 + StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, ObjectRecord<String, String>> containerOptions =
  63 + StreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder()
  64 + .batchSize(10) // 一次性最多拉取多少条消息
  65 + .targetType(String.class) // 目标类型。统一使用 String,通过自己封装的 AbstractStreamMessageListener 去反序列化
  66 + .build();
  67 + // 创建 container 对象
  68 + StreamMessageListenerContainer<String, ObjectRecord<String, String>> container = StreamMessageListenerContainer.create(
  69 + redisTemplate.getRequiredConnectionFactory(), containerOptions);
  70 +
  71 + // 第二步,注册监听器,消费对应的 Stream 主题
  72 + String consumerName = buildConsumerName();
  73 +// String consumerName = "110";
  74 + listeners.forEach(listener -> {
  75 + // 创建 listener 对应的消费者分组
  76 + try {
  77 + redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup());
  78 + } catch (Exception ignore) {}
  79 + // 设置 listener 对应的 redisTemplate
  80 + listener.setRedisTemplate(redisTemplate);
  81 + // 创建 Consumer 对象
  82 + Consumer consumer = Consumer.from(listener.getGroup(), consumerName);
  83 + // 设置 Consumer 消费进度,以最小消费进度为准
  84 + StreamOffset<String> streamOffset = StreamOffset.create(listener.getStreamKey(), ReadOffset.lastConsumed());
  85 + // 设置 Consumer 监听
  86 + StreamMessageListenerContainer.StreamReadRequestBuilder<String> builder = StreamMessageListenerContainer.StreamReadRequest
  87 + .builder(streamOffset).consumer(consumer)
  88 + .autoAcknowledge(false) // 不自动 ack
  89 + .cancelOnError(throwable -> false); // 默认配置,发生异常就取消消费,显然不符合预期;因此,我们设置为 false
  90 + container.register(builder.build(), listener);
  91 + });
  92 + return container;
  93 + }
  94 +
  95 + /**
  96 + * 构建消费者名字,使用本地 IP + 进程编号的方式。
  97 + * 参考自 RocketMQ clientId 的实现
  98 + *
  99 + * @return 消费者名字
  100 + */
  101 + private static String buildConsumerName() {
  102 + return String.format("%s@%d", SystemUtil.getHostInfo().getAddress(), SystemUtil.getCurrentPID());
  103 + }
  104 +
  105 +}
yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/core/pubsub/AbstractChannelMessageListener.java renamed to yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/pubsub/AbstractChannelMessageListener.java
1 -package cn.iocoder.yudao.framework.redis.core.pubsub; 1 +package cn.iocoder.yudao.framework.mq.core.pubsub;
2 2
3 import cn.hutool.core.util.TypeUtil; 3 import cn.hutool.core.util.TypeUtil;
4 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 4 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/core/pubsub/ChannelMessage.java renamed to yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/pubsub/ChannelMessage.java
1 -package cn.iocoder.yudao.framework.redis.core.pubsub; 1 +package cn.iocoder.yudao.framework.mq.core.pubsub;
2 2
3 import com.fasterxml.jackson.annotation.JsonIgnore; 3 import com.fasterxml.jackson.annotation.JsonIgnore;
4 4
yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/core/stream/AbstractStreamMessageListener.java renamed to yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/stream/AbstractStreamMessageListener.java
1 -package cn.iocoder.yudao.framework.redis.core.stream; 1 +package cn.iocoder.yudao.framework.mq.core.stream;
2 2
3 import cn.hutool.core.util.TypeUtil; 3 import cn.hutool.core.util.TypeUtil;
4 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 4 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/core/stream/StreamMessage.java renamed to yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/stream/StreamMessage.java
1 -package cn.iocoder.yudao.framework.redis.core.stream; 1 +package cn.iocoder.yudao.framework.mq.core.stream;
2 2
3 import com.fasterxml.jackson.annotation.JsonIgnore; 3 import com.fasterxml.jackson.annotation.JsonIgnore;
4 4
yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/core/util/RedisMessageUtils.java renamed to yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/util/RedisMessageUtils.java
1 -package cn.iocoder.yudao.framework.redis.core.util; 1 +package cn.iocoder.yudao.framework.mq.core.util;
2 2
3 -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage;  
4 -import cn.iocoder.yudao.framework.redis.core.stream.StreamMessage; 3 +import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
  4 +import cn.iocoder.yudao.framework.mq.core.stream.StreamMessage;
5 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 5 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
6 import org.springframework.data.redis.connection.stream.RecordId; 6 import org.springframework.data.redis.connection.stream.RecordId;
7 import org.springframework.data.redis.connection.stream.StreamRecords; 7 import org.springframework.data.redis.connection.stream.StreamRecords;
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/package-info.java 0 → 100644
  1 +/**
  2 + * 消息队列,基于 Redis 提供:
  3 + * 1. 基于 Pub/Sub 实现广播消费
  4 + * 2. 基于 Stream 实现集群消费
  5 + */
  6 +package cn.iocoder.yudao.framework.mq;
yudao-framework/yudao-spring-boot-starter-mq/src/main/resources/META-INF/spring.factories 0 → 100644
  1 +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2 + cn.iocoder.yudao.framework.mq.config.YudaoMQAutoConfiguration
yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoRedisAutoConfiguration.java
1 package cn.iocoder.yudao.framework.redis.config; 1 package cn.iocoder.yudao.framework.redis.config;
2 2
3 -import cn.hutool.system.SystemUtil;  
4 -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener;  
5 -import cn.iocoder.yudao.framework.redis.core.stream.AbstractStreamMessageListener;  
6 import lombok.extern.slf4j.Slf4j; 3 import lombok.extern.slf4j.Slf4j;
7 import org.springframework.context.annotation.Bean; 4 import org.springframework.context.annotation.Bean;
8 import org.springframework.context.annotation.Configuration; 5 import org.springframework.context.annotation.Configuration;
9 import org.springframework.data.redis.connection.RedisConnectionFactory; 6 import org.springframework.data.redis.connection.RedisConnectionFactory;
10 -import org.springframework.data.redis.connection.stream.Consumer;  
11 -import org.springframework.data.redis.connection.stream.ObjectRecord;  
12 -import org.springframework.data.redis.connection.stream.ReadOffset;  
13 -import org.springframework.data.redis.connection.stream.StreamOffset;  
14 import org.springframework.data.redis.core.RedisTemplate; 7 import org.springframework.data.redis.core.RedisTemplate;
15 -import org.springframework.data.redis.listener.ChannelTopic;  
16 -import org.springframework.data.redis.listener.RedisMessageListenerContainer;  
17 import org.springframework.data.redis.serializer.RedisSerializer; 8 import org.springframework.data.redis.serializer.RedisSerializer;
18 -import org.springframework.data.redis.stream.StreamMessageListenerContainer;  
19 -  
20 -import java.util.List;  
21 9
22 /** 10 /**
23 * Redis 配置类 11 * Redis 配置类
@@ -44,76 +32,4 @@ public class YudaoRedisAutoConfiguration { @@ -44,76 +32,4 @@ public class YudaoRedisAutoConfiguration {
44 return template; 32 return template;
45 } 33 }
46 34
47 - /**  
48 - * 创建 Redis Pub/Sub 广播消费的容器  
49 - */  
50 - @Bean  
51 - public RedisMessageListenerContainer redisMessageListenerContainer(  
52 - RedisConnectionFactory factory, List<AbstractChannelMessageListener<?>> listeners) {  
53 - // 创建 RedisMessageListenerContainer 对象  
54 - RedisMessageListenerContainer container = new RedisMessageListenerContainer();  
55 - // 设置 RedisConnection 工厂。  
56 - container.setConnectionFactory(factory);  
57 - // 添加监听器  
58 - listeners.forEach(listener -> {  
59 - container.addMessageListener(listener, new ChannelTopic(listener.getChannel()));  
60 - log.info("[redisMessageListenerContainer][注册 Channel({}) 对应的监听器({})]",  
61 - listener.getChannel(), listener.getClass().getName());  
62 - });  
63 - return container;  
64 - }  
65 -  
66 - /**  
67 - * 创建 Redis Stream 集群消费的容器  
68 - *  
69 - * Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html  
70 - */  
71 - @Bean(initMethod = "start", destroyMethod = "stop")  
72 - public StreamMessageListenerContainer<String, ObjectRecord<String, String>> redisStreamMessageListenerContainer(  
73 - RedisTemplate<String, Object> redisTemplate, List<AbstractStreamMessageListener<?>> listeners) {  
74 - // 第一步,创建 StreamMessageListenerContainer 容器  
75 - // 创建 options 配置  
76 - StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, ObjectRecord<String, String>> containerOptions =  
77 - StreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder()  
78 - .batchSize(10) // 一次性最多拉取多少条消息  
79 - .targetType(String.class) // 目标类型。统一使用 String,通过自己封装的 AbstractStreamMessageListener 去反序列化  
80 - .build();  
81 - // 创建 container 对象  
82 - StreamMessageListenerContainer<String, ObjectRecord<String, String>> container = StreamMessageListenerContainer.create(  
83 - redisTemplate.getRequiredConnectionFactory(), containerOptions);  
84 -  
85 - // 第二步,注册监听器,消费对应的 Stream 主题  
86 - String consumerName = buildConsumerName();  
87 -// String consumerName = "110";  
88 - listeners.forEach(listener -> {  
89 - // 创建 listener 对应的消费者分组  
90 - try {  
91 - redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup());  
92 - } catch (Exception ignore) {}  
93 - // 设置 listener 对应的 redisTemplate  
94 - listener.setRedisTemplate(redisTemplate);  
95 - // 创建 Consumer 对象  
96 - Consumer consumer = Consumer.from(listener.getGroup(), consumerName);  
97 - // 设置 Consumer 消费进度,以最小消费进度为准  
98 - StreamOffset<String> streamOffset = StreamOffset.create(listener.getStreamKey(), ReadOffset.lastConsumed());  
99 - // 设置 Consumer 监听  
100 - StreamMessageListenerContainer.StreamReadRequestBuilder<String> builder = StreamMessageListenerContainer.StreamReadRequest  
101 - .builder(streamOffset).consumer(consumer)  
102 - .autoAcknowledge(false) // 不自动 ack  
103 - .cancelOnError(throwable -> false); // 默认配置,发生异常就取消消费,显然不符合预期;因此,我们设置为 false  
104 - container.register(builder.build(), listener);  
105 - });  
106 - return container;  
107 - }  
108 -  
109 - /**  
110 - * 构建消费者名字,使用本地 IP + 进程编号的方式。  
111 - * 参考自 RocketMQ clientId 的实现  
112 - *  
113 - * @return 消费者名字  
114 - */  
115 - private static String buildConsumerName() {  
116 - return String.format("%s@%d", SystemUtil.getHostInfo().getAddress(), SystemUtil.getCurrentPID());  
117 - }  
118 -  
119 } 35 }