Commit d29b0beb9b528c379c78407730221250cf11965f

Authored by YunaiV
1 parent ade55d89

优化 mq starter 组件,增加 RedisMQTemplate 模板类

Showing 26 changed files with 137 additions and 75 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.mq.message.config;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
  3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage;
4 4 import lombok.Data;
5 5  
6 6 /**
7 7 * 配置数据刷新 Message
8 8 */
9 9 @Data
10   -public class InfConfigRefreshMessage implements ChannelMessage {
  10 +public class InfConfigRefreshMessage extends AbstractChannelMessage {
11 11  
12 12 @Override
13 13 public String getChannel() {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/config/InfConfigProducer.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config;
2 2  
3 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;
  4 +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
6 5 import org.springframework.stereotype.Component;
7 6  
8 7 import javax.annotation.Resource;
... ... @@ -14,14 +13,14 @@ import javax.annotation.Resource;
14 13 public class InfConfigProducer {
15 14  
16 15 @Resource
17   - private StringRedisTemplate stringRedisTemplate;
  16 + private RedisMQTemplate redisMQTemplate;
18 17  
19 18 /**
20 19 * 发送 {@link InfConfigRefreshMessage} 消息
21 20 */
22 21 public void sendConfigRefreshMessage() {
23 22 InfConfigRefreshMessage message = new InfConfigRefreshMessage();
24   - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
  23 + redisMQTemplate.send(message);
25 24 }
26 25  
27 26 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.dept;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
  3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage;
4 4 import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
5 6  
6 7 /**
7 8 * 部门数据刷新 Message
  9 + *
  10 + * @author 芋道源码
8 11 */
9 12 @Data
10   -public class SysDeptRefreshMessage implements ChannelMessage {
  13 +@EqualsAndHashCode(callSuper = true)
  14 +public class SysDeptRefreshMessage extends AbstractChannelMessage {
11 15  
12 16 @Override
13 17 public String getChannel() {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.dict;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
  3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage;
4 4 import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
5 6  
6 7 /**
7 8 * 字典数据数据刷新 Message
8 9 */
9 10 @Data
10   -public class SysDictDataRefreshMessage implements ChannelMessage {
  11 +@EqualsAndHashCode(callSuper = true)
  12 +public class SysDictDataRefreshMessage extends AbstractChannelMessage {
11 13  
12 14 @Override
13 15 public String getChannel() {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.mail;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.stream.StreamMessage;
  3 +import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessage;
4 4 import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
5 6  
6 7 import javax.validation.constraints.NotNull;
7 8 import java.util.Map;
... ... @@ -12,7 +13,8 @@ import java.util.Map;
12 13 * @author 芋道源码
13 14 */
14 15 @Data
15   -public class SysMailSendMessage implements StreamMessage {
  16 +@EqualsAndHashCode(callSuper = true)
  17 +public class SysMailSendMessage extends AbstractStreamMessage {
16 18  
17 19 /**
18 20 * 邮箱地址
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
  3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage;
4 4 import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
5 6  
6 7 /**
7 8 * 菜单数据刷新 Message
  9 + *
  10 + * @author 芋道源码
8 11 */
9 12 @Data
10   -public class SysMenuRefreshMessage implements ChannelMessage {
  13 +@EqualsAndHashCode(callSuper = true)
  14 +public class SysMenuRefreshMessage extends AbstractChannelMessage {
11 15  
12 16 @Override
13 17 public String getChannel() {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
  3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage;
4 4 import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
5 6  
6 7 /**
7 8 * 角色与菜单数据刷新 Message
  9 + *
  10 + * @author 芋道源码
8 11 */
9 12 @Data
10   -public class SysRoleMenuRefreshMessage implements ChannelMessage {
  13 +@EqualsAndHashCode(callSuper = true)
  14 +public class SysRoleMenuRefreshMessage extends AbstractChannelMessage {
11 15  
12 16 @Override
13 17 public String getChannel() {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
  3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage;
4 4 import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
5 6  
6 7 /**
7 8 * 角色数据刷新 Message
  9 + *
  10 + * @author 芋道源码
8 11 */
9 12 @Data
10   -public class SysRoleRefreshMessage implements ChannelMessage {
  13 +@EqualsAndHashCode(callSuper = true)
  14 +public class SysRoleRefreshMessage extends AbstractChannelMessage {
11 15  
12 16 @Override
13 17 public String getChannel() {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
  3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage;
4 4 import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
5 6  
6 7 /**
7 8 * 短信渠道的数据刷新 Message
  9 + *
  10 + * @author 芋道源码
8 11 */
9 12 @Data
10   -public class SysSmsChannelRefreshMessage implements ChannelMessage {
  13 +@EqualsAndHashCode(callSuper = true)
  14 +public class SysSmsChannelRefreshMessage extends AbstractChannelMessage {
11 15  
12 16 @Override
13 17 public String getChannel() {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
  3 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage;
4 4 import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
5 6  
6 7 /**
7 8 * 短信模板的数据刷新 Message
  9 + *
  10 + * @author 芋道源码
8 11 */
9 12 @Data
10   -public class SysSmsTemplateRefreshMessage implements ChannelMessage {
  13 +@EqualsAndHashCode(callSuper = true)
  14 +public class SysSmsTemplateRefreshMessage extends AbstractChannelMessage {
11 15  
12 16 @Override
13 17 public String getChannel() {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dept/SysDeptProducer.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
4 3 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage;
5   -import org.springframework.data.redis.core.StringRedisTemplate;
  4 +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
6 5 import org.springframework.stereotype.Component;
7 6  
8 7 import javax.annotation.Resource;
... ... @@ -14,14 +13,14 @@ import javax.annotation.Resource;
14 13 public class SysDeptProducer {
15 14  
16 15 @Resource
17   - private StringRedisTemplate stringRedisTemplate;
  16 + private RedisMQTemplate redisMQTemplate;
18 17  
19 18 /**
20 19 * 发送 {@link SysDeptRefreshMessage} 消息
21 20 */
22 21 public void sendDeptRefreshMessage() {
23 22 SysDeptRefreshMessage message = new SysDeptRefreshMessage();
24   - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
  23 + redisMQTemplate.send(message);
25 24 }
26 25  
27 26 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dict/SysDictDataProducer.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
4 3 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage;
5   -import org.springframework.data.redis.core.StringRedisTemplate;
  4 +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
6 5 import org.springframework.stereotype.Component;
7 6  
8 7 import javax.annotation.Resource;
... ... @@ -14,14 +13,14 @@ import javax.annotation.Resource;
14 13 public class SysDictDataProducer {
15 14  
16 15 @Resource
17   - private StringRedisTemplate stringRedisTemplate;
  16 + private RedisMQTemplate redisMQTemplate;
18 17  
19 18 /**
20 19 * 发送 {@link SysDictDataRefreshMessage} 消息
21 20 */
22 21 public void sendDictDataRefreshMessage() {
23 22 SysDictDataRefreshMessage message = new SysDictDataRefreshMessage();
24   - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
  23 + redisMQTemplate.send(message);
25 24 }
26 25  
27 26 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysMenuProducer.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
4 3 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage;
5   -import org.springframework.data.redis.core.StringRedisTemplate;
  4 +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
6 5 import org.springframework.stereotype.Component;
7 6  
8 7 import javax.annotation.Resource;
... ... @@ -14,14 +13,14 @@ import javax.annotation.Resource;
14 13 public class SysMenuProducer {
15 14  
16 15 @Resource
17   - private StringRedisTemplate stringRedisTemplate;
  16 + private RedisMQTemplate redisMQTemplate;
18 17  
19 18 /**
20 19 * 发送 {@link SysMenuRefreshMessage} 消息
21 20 */
22 21 public void sendMenuRefreshMessage() {
23 22 SysMenuRefreshMessage message = new SysMenuRefreshMessage();
24   - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
  23 + redisMQTemplate.send(message);
25 24 }
26 25  
27 26 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysPermissionProducer.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
4 3 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage;
5   -import org.springframework.data.redis.core.StringRedisTemplate;
  4 +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
6 5 import org.springframework.stereotype.Component;
7 6  
8 7 import javax.annotation.Resource;
... ... @@ -14,14 +13,14 @@ import javax.annotation.Resource;
14 13 public class SysPermissionProducer {
15 14  
16 15 @Resource
17   - private StringRedisTemplate stringRedisTemplate;
  16 + private RedisMQTemplate redisMQTemplate;
18 17  
19 18 /**
20 19 * 发送 {@link SysRoleMenuRefreshMessage} 消息
21 20 */
22 21 public void sendRoleMenuRefreshMessage() {
23 22 SysRoleMenuRefreshMessage message = new SysRoleMenuRefreshMessage();
24   - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
  23 + redisMQTemplate.send(message);
25 24 }
26 25  
27 26 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysRoleProducer.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
4 3 import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage;
5   -import org.springframework.data.redis.core.StringRedisTemplate;
  4 +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
6 5 import org.springframework.stereotype.Component;
7 6  
8 7 import javax.annotation.Resource;
... ... @@ -16,14 +15,14 @@ import javax.annotation.Resource;
16 15 public class SysRoleProducer {
17 16  
18 17 @Resource
19   - private StringRedisTemplate stringRedisTemplate;
  18 + private RedisMQTemplate redisMQTemplate;
20 19  
21 20 /**
22 21 * 发送 {@link SysRoleRefreshMessage} 消息
23 22 */
24 23 public void sendRoleRefreshMessage() {
25 24 SysRoleRefreshMessage message = new SysRoleRefreshMessage();
26   - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
  25 + redisMQTemplate.send(message);
27 26 }
28 27  
29 28 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms;
2 2  
3   -import cn.iocoder.yudao.framework.common.core.KeyValue;
4   -import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
5 3 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage;
6 4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage;
  5 +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
7 6 import lombok.extern.slf4j.Slf4j;
8   -import org.springframework.data.redis.core.StringRedisTemplate;
9 7 import org.springframework.stereotype.Component;
10 8  
11 9 import javax.annotation.Resource;
12   -import java.util.List;
13 10  
14 11 /**
15 12 * Sms 短信相关消息的 Producer
... ... @@ -22,14 +19,14 @@ import java.util.List;
22 19 public class SysSmsProducer {
23 20  
24 21 @Resource
25   - private StringRedisTemplate stringRedisTemplate;
  22 + private RedisMQTemplate redisMQTemplate;
26 23  
27 24 /**
28 25 * 发送 {@link SysSmsChannelRefreshMessage} 消息
29 26 */
30 27 public void sendSmsChannelRefreshMessage() {
31 28 SysSmsChannelRefreshMessage message = new SysSmsChannelRefreshMessage();
32   - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
  29 + redisMQTemplate.send(message);
33 30 }
34 31  
35 32 /**
... ... @@ -37,7 +34,7 @@ public class SysSmsProducer {
37 34 */
38 35 public void sendSmsTemplateRefreshMessage() {
39 36 SysSmsTemplateRefreshMessage message = new SysSmsTemplateRefreshMessage();
40   - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
  37 + redisMQTemplate.send(message);
41 38 }
42 39  
43 40 }
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/sms/SysSmsSendMessage.java
1 1 package cn.iocoder.yudao.coreservice.modules.system.mq.message.sms;
2 2  
3 3 import cn.iocoder.yudao.framework.common.core.KeyValue;
4   -import cn.iocoder.yudao.framework.mq.core.stream.StreamMessage;
  4 +import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessage;
5 5 import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
6 7  
7 8 import javax.validation.constraints.NotNull;
8 9 import java.util.List;
... ... @@ -13,7 +14,8 @@ import java.util.List;
13 14 * @author 芋道源码
14 15 */
15 16 @Data
16   -public class SysSmsSendMessage implements StreamMessage {
  17 +@EqualsAndHashCode(callSuper = true)
  18 +public class SysSmsSendMessage extends AbstractStreamMessage {
17 19  
18 20 /**
19 21 * 短信日志编号
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/sms/SysSmsCoreProducer.java
... ... @@ -2,9 +2,8 @@ package cn.iocoder.yudao.coreservice.modules.system.mq.producer.sms;
2 2  
3 3 import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
4 4 import cn.iocoder.yudao.framework.common.core.KeyValue;
5   -import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
  5 +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
6 6 import lombok.extern.slf4j.Slf4j;
7   -import org.springframework.data.redis.core.StringRedisTemplate;
8 7 import org.springframework.stereotype.Component;
9 8  
10 9 import javax.annotation.Resource;
... ... @@ -21,7 +20,7 @@ import java.util.List;
21 20 public class SysSmsCoreProducer {
22 21  
23 22 @Resource
24   - private StringRedisTemplate stringRedisTemplate;
  23 + private RedisMQTemplate redisMQTemplate;
25 24  
26 25 /**
27 26 * 发送 {@link SysSmsSendMessage} 消息
... ... @@ -36,7 +35,7 @@ public class SysSmsCoreProducer {
36 35 Long channelId, String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
37 36 SysSmsSendMessage message = new SysSmsSendMessage().setLogId(logId).setMobile(mobile);
38 37 message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams);
39   - RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message);
  38 + redisMQTemplate.send(message);
40 39 }
41 40  
42 41 }
... ...
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/config/YudaoMQAutoConfiguration.java
1 1 package cn.iocoder.yudao.framework.mq.config;
2 2  
3 3 import cn.hutool.system.SystemUtil;
  4 +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
4 5 import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
5 6 import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
6 7 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
7 8 import lombok.extern.slf4j.Slf4j;
8 9 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
9   -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
10 10 import org.springframework.context.annotation.Bean;
11 11 import org.springframework.context.annotation.Configuration;
12 12 import org.springframework.data.redis.connection.RedisConnectionFactory;
... ... @@ -15,6 +15,7 @@ import org.springframework.data.redis.connection.stream.ObjectRecord;
15 15 import org.springframework.data.redis.connection.stream.ReadOffset;
16 16 import org.springframework.data.redis.connection.stream.StreamOffset;
17 17 import org.springframework.data.redis.core.RedisTemplate;
  18 +import org.springframework.data.redis.core.StringRedisTemplate;
18 19 import org.springframework.data.redis.listener.ChannelTopic;
19 20 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
20 21 import org.springframework.data.redis.stream.StreamMessageListenerContainer;
... ... @@ -31,6 +32,13 @@ import java.util.List;
31 32 @Slf4j
32 33 public class YudaoMQAutoConfiguration {
33 34  
  35 + @Bean
  36 + public RedisMQTemplate redisMQTemplate(StringRedisTemplate stringRedisTemplate) {
  37 + return new RedisMQTemplate(stringRedisTemplate);
  38 + }
  39 +
  40 + // ========== 消费者相关 ==========
  41 +
34 42 /**
35 43 * 创建 Redis Pub/Sub 广播消费的容器
36 44 */
... ... @@ -71,7 +79,6 @@ public class YudaoMQAutoConfiguration {
71 79  
72 80 // 第二步,注册监听器,消费对应的 Stream 主题
73 81 String consumerName = buildConsumerName();
74   -// String consumerName = "110";
75 82 listeners.forEach(listener -> {
76 83 // 创建 listener 对应的消费者分组
77 84 try {
... ...
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/util/RedisMessageUtils.java renamed to yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/RedisMQTemplate.java
1   -package cn.iocoder.yudao.framework.mq.core.util;
  1 +package cn.iocoder.yudao.framework.mq.core;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
4   -import cn.iocoder.yudao.framework.mq.core.stream.StreamMessage;
5 3 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  4 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage;
  5 +import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessage;
  6 +import lombok.AllArgsConstructor;
6 7 import org.springframework.data.redis.connection.stream.RecordId;
7 8 import org.springframework.data.redis.connection.stream.StreamRecords;
8 9 import org.springframework.data.redis.core.RedisTemplate;
9 10  
10 11 /**
11   - * Redis 消息工具类
  12 + * Redis MQ 操作模板类
12 13 *
13 14 * @author 芋道源码
14 15 */
15   -public class RedisMessageUtils {
  16 +@AllArgsConstructor
  17 +public class RedisMQTemplate {
  18 +
  19 + private final RedisTemplate<String, ?> redisTemplate;
16 20  
17 21 /**
18 22 * 发送 Redis 消息,基于 Redis pub/sub 实现
19 23 *
20   - * @param redisTemplate Redis 操作模板
21 24 * @param message 消息
22 25 */
23   - public static <T extends ChannelMessage> void sendChannelMessage(RedisTemplate<?, ?> redisTemplate, T message) {
  26 + public <T extends AbstractChannelMessage> void send(T message) {
24 27 redisTemplate.convertAndSend(message.getChannel(), JsonUtils.toJsonString(message));
25 28 }
26 29  
27 30 /**
28 31 * 发送 Redis 消息,基于 Redis Stream 实现
29 32 *
30   - * @param redisTemplate Redis 操作模板
31 33 * @param message 消息
32 34 * @return 消息记录的编号对象
33 35 */
34   - public static <T extends StreamMessage> RecordId sendStreamMessage(RedisTemplate<String, ?> redisTemplate, T message) {
  36 + public <T extends AbstractStreamMessage> RecordId send(T message) {
35 37 return redisTemplate.opsForStream().add(StreamRecords.newRecord()
36 38 .ofObject(JsonUtils.toJsonString(message)) // 设置内容
37 39 .withStreamKey(message.getStreamKey())); // 设置 stream key
... ...
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/message/AbstractRedisMessage.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.mq.core.message;
  2 +
  3 +import java.util.HashMap;
  4 +import java.util.Map;
  5 +
  6 +/**
  7 + * Redis 消息抽象基类
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +public abstract class AbstractRedisMessage {
  12 +
  13 + /**
  14 + * 头
  15 + */
  16 + private final Map<String, String> headers = new HashMap<>();
  17 +
  18 + public String getHeader(String key) {
  19 + return headers.get(key);
  20 + }
  21 +
  22 + public void addHeader(String key, String value) {
  23 + headers.put(key, value);
  24 + }
  25 +
  26 +}
... ...
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/pubsub/ChannelMessage.java renamed to yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/pubsub/AbstractChannelMessage.java
1 1 package cn.iocoder.yudao.framework.mq.core.pubsub;
2 2  
  3 +import cn.iocoder.yudao.framework.mq.core.message.AbstractRedisMessage;
3 4 import com.fasterxml.jackson.annotation.JsonIgnore;
4 5  
5 6 /**
6   - * Redis Channel Message 接口
  7 + * Redis Channel Message 抽象类
7 8 *
8 9 * @author 芋道源码
9 10 */
10   -public interface ChannelMessage {
  11 +public abstract class AbstractChannelMessage extends AbstractRedisMessage {
11 12  
12 13 /**
13 14 * 获得 Redis Channel
... ... @@ -15,6 +16,6 @@ public interface ChannelMessage {
15 16 * @return Channel
16 17 */
17 18 @JsonIgnore // 避免序列化
18   - String getChannel();
  19 + public abstract String getChannel();
19 20  
20 21 }
... ...
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/pubsub/AbstractChannelMessageListener.java
... ... @@ -15,7 +15,7 @@ import java.lang.reflect.Type;
15 15 *
16 16 * @author 芋道源码
17 17 */
18   -public abstract class AbstractChannelMessageListener<T extends ChannelMessage> implements MessageListener {
  18 +public abstract class AbstractChannelMessageListener<T extends AbstractChannelMessage> implements MessageListener {
19 19  
20 20 /**
21 21 * 消息类型
... ...
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/stream/StreamMessage.java renamed to yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/stream/AbstractStreamMessage.java
... ... @@ -3,11 +3,11 @@ package cn.iocoder.yudao.framework.mq.core.stream;
3 3 import com.fasterxml.jackson.annotation.JsonIgnore;
4 4  
5 5 /**
6   - * Redis Stream Message 接口
  6 + * Redis Stream Message 抽象类
7 7 *
8 8 * @author 芋道源码
9 9 */
10   -public interface StreamMessage {
  10 +public abstract class AbstractStreamMessage {
11 11  
12 12 /**
13 13 * 获得 Redis Stream Key
... ... @@ -15,6 +15,6 @@ public interface StreamMessage {
15 15 * @return Channel
16 16 */
17 17 @JsonIgnore // 避免序列化
18   - String getStreamKey();
  18 + public abstract String getStreamKey();
19 19  
20 20 }
... ...
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/core/stream/AbstractStreamMessageListener.java
... ... @@ -19,7 +19,7 @@ import java.lang.reflect.Type;
19 19 *
20 20 * @author 芋道源码
21 21 */
22   -public abstract class AbstractStreamMessageListener<T extends StreamMessage>
  22 +public abstract class AbstractStreamMessageListener<T extends AbstractStreamMessage>
23 23 implements StreamListener<String, ObjectRecord<String, String>> {
24 24  
25 25 /**
... ... @@ -39,7 +39,7 @@ public abstract class AbstractStreamMessageListener&lt;T extends StreamMessage&gt;
39 39 @Getter
40 40 private String group;
41 41 /**
42   - *
  42 + * RedisTemplate
43 43 */
44 44 @Setter
45 45 private RedisTemplate<String, ?> redisTemplate;
... ...
yudao-framework/yudao-spring-boot-starter-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/package-info.java
... ... @@ -4,5 +4,11 @@
4 4 * 2. Web:请求 HTTP API 时,Header 带上 tenant-id 租户编号。
5 5 * 3. Job:在 JobHandler 执行任务时,会按照每个租户,都独立并行执行一次。
6 6 * 4. MQ:TODO
  7 + * 5. Async:异步需要保证 ThreadLocal 的传递性,通过使用阿里开源的 TransmittableThreadLocal 实现。相关的改造点,可见:
  8 + * 1)Spring Async:
  9 + * {@link cn.iocoder.yudao.framework.quartz.config.YudaoAsyncAutoConfiguration#threadPoolTaskExecutorBeanPostProcessor()}
  10 + * 2)Spring Security:
  11 + * TransmittableThreadLocalSecurityContextHolderStrategy
  12 + * 和 YudaoSecurityAutoConfiguration#securityContextHolderMethodInvokingFactoryBean() 方法
7 13 */
8 14 package cn.iocoder.yudao.framework.tenant;
... ...