Commit 0b5662b6989b5ae053f441adc80b48ad14fe02f9
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
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
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
yudao-framework/yudao-spring-boot-starter-mq/src/main/resources/META-INF/spring.factories
0 → 100644
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 | } |