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 | 65 | <artifactId>yudao-spring-boot-starter-job</artifactId> |
| 66 | 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 | 75 | <dependency> |
| 70 | 76 | <groupId>cn.iocoder.boot</groupId> |
| ... | ... | @@ -104,6 +110,10 @@ |
| 104 | 110 | <groupId>cn.smallbun.screw</groupId> |
| 105 | 111 | <artifactId>screw-core</artifactId> <!-- 实现数据库文档 --> |
| 106 | 112 | </dependency> |
| 113 | + <dependency> | |
| 114 | + <groupId>cn.iocoder.boot</groupId> | |
| 115 | + <artifactId>yudao-spring-boot-starter-mq</artifactId> | |
| 116 | + </dependency> | |
| 107 | 117 | |
| 108 | 118 | </dependencies> |
| 109 | 119 | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java
| 1 | 1 | package cn.iocoder.yudao.adminserver.modules.infra.mq.consumer.config; |
| 2 | 2 | |
| 3 | 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 | 5 | import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage; |
| 6 | 6 | import lombok.extern.slf4j.Slf4j; |
| 7 | 7 | import org.springframework.stereotype.Component; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java
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 | -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; | |
| 4 | 3 | import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage; |
| 4 | +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils; | |
| 5 | 5 | import org.springframework.data.redis.core.StringRedisTemplate; |
| 6 | 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 | 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 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage; |
| 5 | 5 | import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; |
| 6 | 6 | import lombok.extern.slf4j.Slf4j; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java
| 1 | 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 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage; |
| 5 | 5 | import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; |
| 6 | 6 | import lombok.extern.slf4j.Slf4j; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/mail/SysMailSendConsumer.java
| 1 | 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 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage; |
| 5 | 5 | import lombok.extern.slf4j.Slf4j; |
| 6 | 6 | import org.springframework.stereotype.Component; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java
| 1 | 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 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage; |
| 5 | 5 | import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; |
| 6 | 6 | import lombok.extern.slf4j.Slf4j; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java
| 1 | 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 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; |
| 5 | 5 | import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; |
| 6 | 6 | import lombok.extern.slf4j.Slf4j; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java
| 1 | 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 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage; |
| 5 | 5 | import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; |
| 6 | 6 | import lombok.extern.slf4j.Slf4j; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java
| 1 | 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 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage; |
| 5 | 5 | import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService; |
| 6 | 6 | import lombok.extern.slf4j.Slf4j; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java
| 1 | 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 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; |
| 5 | 5 | import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService; |
| 6 | 6 | import lombok.extern.slf4j.Slf4j; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java
| 1 | 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 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage; |
| 5 | 5 | import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService; |
| 6 | 6 | import lombok.extern.slf4j.Slf4j; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsSendMessage.java
| 1 | 1 | package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms; |
| 2 | 2 | |
| 3 | 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 | 5 | import lombok.Data; |
| 6 | 6 | |
| 7 | 7 | import javax.validation.constraints.NotNull; | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java
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.redis.core.util.RedisMessageUtils; | |
| 3 | +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils; | |
| 4 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage; |
| 5 | 5 | import org.springframework.data.redis.core.StringRedisTemplate; |
| 6 | 6 | import org.springframework.stereotype.Component; | ... | ... |
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.redis.core.util.RedisMessageUtils; | |
| 3 | +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils; | |
| 4 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage; |
| 5 | 5 | import org.springframework.data.redis.core.StringRedisTemplate; |
| 6 | 6 | import org.springframework.stereotype.Component; | ... | ... |
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.redis.core.util.RedisMessageUtils; | |
| 3 | +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils; | |
| 4 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage; |
| 5 | 5 | import org.springframework.data.redis.core.StringRedisTemplate; |
| 6 | 6 | import org.springframework.stereotype.Component; | ... | ... |
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.redis.core.util.RedisMessageUtils; | |
| 3 | +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils; | |
| 4 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; |
| 5 | 5 | import org.springframework.data.redis.core.StringRedisTemplate; |
| 6 | 6 | import org.springframework.stereotype.Component; | ... | ... |
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.redis.core.util.RedisMessageUtils; | |
| 3 | +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils; | |
| 4 | 4 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage; |
| 5 | 5 | import org.springframework.data.redis.core.StringRedisTemplate; |
| 6 | 6 | import org.springframework.stereotype.Component; | ... | ... |
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 | 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 | 5 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage; |
| 6 | 6 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; |
| 7 | 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 | 6 | import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms.SysSmsSendConsumer; |
| 7 | 7 | import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage; |
| 8 | 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 | 10 | import org.junit.jupiter.api.Disabled; |
| 11 | 11 | import org.junit.jupiter.api.Test; |
| 12 | 12 | import org.springframework.context.annotation.Import; | ... | ... |
yudao-dependencies/pom.xml
| ... | ... | @@ -193,6 +193,13 @@ |
| 193 | 193 | <version>${revision}</version> |
| 194 | 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 | 204 | <dependency> |
| 198 | 205 | <groupId>cn.iocoder.boot</groupId> | ... | ... |
yudao-framework/pom.xml
| ... | ... | @@ -15,12 +15,16 @@ |
| 15 | 15 | <module>yudao-spring-boot-starter-redis</module> |
| 16 | 16 | <module>yudao-spring-boot-starter-web</module> |
| 17 | 17 | <module>yudao-spring-boot-starter-security</module> |
| 18 | + | |
| 18 | 19 | <module>yudao-spring-boot-starter-monitor</module> |
| 19 | 20 | <module>yudao-spring-boot-starter-protection</module> |
| 20 | 21 | <module>yudao-spring-boot-starter-config</module> |
| 21 | 22 | <module>yudao-spring-boot-starter-job</module> |
| 23 | + <module>yudao-spring-boot-starter-mq</module> | |
| 24 | + | |
| 22 | 25 | <module>yudao-spring-boot-starter-excel</module> |
| 23 | 26 | <module>yudao-spring-boot-starter-test</module> |
| 27 | + | |
| 24 | 28 | <module>yudao-spring-boot-starter-biz-operatelog</module> |
| 25 | 29 | <module>yudao-spring-boot-starter-biz-dict</module> |
| 26 | 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
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
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 | 5 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 6 | 6 | import org.springframework.data.redis.connection.stream.RecordId; |
| 7 | 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 | 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 | 3 | import lombok.extern.slf4j.Slf4j; |
| 7 | 4 | import org.springframework.context.annotation.Bean; |
| 8 | 5 | import org.springframework.context.annotation.Configuration; |
| 9 | 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 | 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 | 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 | 11 | * Redis 配置类 |
| ... | ... | @@ -44,76 +32,4 @@ public class YudaoRedisAutoConfiguration { |
| 44 | 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 | } | ... | ... |