Commit 2a349972b4768eab72c559ba9750008c3852ceee
1 parent
79a0b4cb
增加 Redis pub sub 机制
Showing
9 changed files
with
113 additions
and
2 deletions
src/main/java/cn/iocoder/dashboard/framework/redis/config/RedisConfig.java
| 1 | package cn.iocoder.dashboard.framework.redis.config; | 1 | package cn.iocoder.dashboard.framework.redis.config; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.dashboard.framework.redis.core.listener.AbstractMessageListener; | ||
| 3 | import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; | 4 | import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; |
| 5 | +import lombok.extern.slf4j.Slf4j; | ||
| 4 | import org.springframework.context.annotation.Bean; | 6 | import org.springframework.context.annotation.Bean; |
| 5 | import org.springframework.context.annotation.Configuration; | 7 | import org.springframework.context.annotation.Configuration; |
| 6 | import org.springframework.data.redis.connection.RedisConnectionFactory; | 8 | import org.springframework.data.redis.connection.RedisConnectionFactory; |
| 7 | import org.springframework.data.redis.core.RedisTemplate; | 9 | import org.springframework.data.redis.core.RedisTemplate; |
| 10 | +import org.springframework.data.redis.listener.ChannelTopic; | ||
| 11 | +import org.springframework.data.redis.listener.RedisMessageListenerContainer; | ||
| 8 | import org.springframework.data.redis.serializer.RedisSerializer; | 12 | import org.springframework.data.redis.serializer.RedisSerializer; |
| 9 | 13 | ||
| 14 | +import java.util.List; | ||
| 15 | + | ||
| 16 | +/** | ||
| 17 | + * Redis 配置类 | ||
| 18 | + */ | ||
| 10 | @Configuration | 19 | @Configuration |
| 20 | +@Slf4j | ||
| 11 | public class RedisConfig { | 21 | public class RedisConfig { |
| 12 | 22 | ||
| 13 | @Bean | 23 | @Bean |
| @@ -23,4 +33,20 @@ public class RedisConfig { | @@ -23,4 +33,20 @@ public class RedisConfig { | ||
| 23 | return template; | 33 | return template; |
| 24 | } | 34 | } |
| 25 | 35 | ||
| 36 | + @Bean | ||
| 37 | + public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory factory, | ||
| 38 | + List<AbstractMessageListener<?>> 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 | + | ||
| 26 | } | 52 | } |
src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyDefine.java
src/main/java/cn/iocoder/dashboard/framework/redis/core/listener/AbstractMessageListener.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.framework.redis.core.listener; | ||
| 2 | + | ||
| 3 | +import org.springframework.data.redis.connection.MessageListener; | ||
| 4 | + | ||
| 5 | +/** | ||
| 6 | + * Redis Pub/Sub 监听器抽象类,用于实现广播消费 | ||
| 7 | + * | ||
| 8 | + * @author 芋道源码 | ||
| 9 | + */ | ||
| 10 | +public abstract class AbstractMessageListener<T> implements MessageListener { | ||
| 11 | + | ||
| 12 | + /** | ||
| 13 | + * 获得 Sub 订阅的 Redis Channel 通道 | ||
| 14 | + * | ||
| 15 | + * @return channel | ||
| 16 | + */ | ||
| 17 | + public abstract String getChannel(); | ||
| 18 | + | ||
| 19 | +} |
src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/SysMenuRefreshConsumer.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.mq.consumer; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.dashboard.framework.redis.core.listener.AbstractMessageListener; | ||
| 4 | +import cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage; | ||
| 5 | +import org.springframework.data.redis.connection.Message; | ||
| 6 | +import org.springframework.stereotype.Component; | ||
| 7 | + | ||
| 8 | +@Component | ||
| 9 | +public class SysMenuRefreshConsumer extends AbstractMessageListener { | ||
| 10 | + | ||
| 11 | + @Override | ||
| 12 | + public void onMessage(Message message, byte[] bytes) { | ||
| 13 | + System.out.println(message); | ||
| 14 | + } | ||
| 15 | + | ||
| 16 | + @Override | ||
| 17 | + public String getChannel() { | ||
| 18 | + return SysMenuRefreshMessage.TOPIC; | ||
| 19 | + } | ||
| 20 | + | ||
| 21 | +} |
src/main/java/cn/iocoder/dashboard/modules/system/mq/message/package-info.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.mq.message; |
src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysMenuRefreshMessage.java
0 → 100644
src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/package-info.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.mq.producer; |
src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysMenuProducer.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.mq.producer.permission; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage; | ||
| 4 | +import org.springframework.data.redis.core.RedisTemplate; | ||
| 5 | +import org.springframework.stereotype.Component; | ||
| 6 | + | ||
| 7 | +import javax.annotation.Resource; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * Menu 菜单相关消息的 Producer | ||
| 11 | + */ | ||
| 12 | +@Component | ||
| 13 | +public class SysMenuProducer { | ||
| 14 | + | ||
| 15 | + @Resource | ||
| 16 | + private RedisTemplate<String, Object> redisTemplate; | ||
| 17 | + | ||
| 18 | + /** | ||
| 19 | + * 发送 {@link SysMenuRefreshMessage} 消息 | ||
| 20 | + */ | ||
| 21 | + public void sendMenuRefreshMessage() { | ||
| 22 | + SysMenuRefreshMessage message = new SysMenuRefreshMessage(); | ||
| 23 | + redisTemplate.convertAndSend(SysMenuRefreshMessage.TOPIC, message); | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | +} |
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java
| @@ -11,6 +11,7 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysMenuMappe | @@ -11,6 +11,7 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysMenuMappe | ||
| 11 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; | 11 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; |
| 12 | import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum; | 12 | import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum; |
| 13 | import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; | 13 | import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; |
| 14 | +import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysMenuProducer; | ||
| 14 | import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; | 15 | import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; |
| 15 | import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; | 16 | import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; |
| 16 | import cn.iocoder.dashboard.util.collection.CollectionUtils; | 17 | import cn.iocoder.dashboard.util.collection.CollectionUtils; |
| @@ -68,6 +69,9 @@ public class SysMenuServiceImpl implements SysMenuService { | @@ -68,6 +69,9 @@ public class SysMenuServiceImpl implements SysMenuService { | ||
| 68 | @Resource | 69 | @Resource |
| 69 | private SysPermissionService permissionService; | 70 | private SysPermissionService permissionService; |
| 70 | 71 | ||
| 72 | + @Resource | ||
| 73 | + private SysMenuProducer menuProducer; | ||
| 74 | + | ||
| 71 | /** | 75 | /** |
| 72 | * 初始化 {@link #menuCache} 和 {@link #permMenuCache} 缓存 | 76 | * 初始化 {@link #menuCache} 和 {@link #permMenuCache} 缓存 |
| 73 | */ | 77 | */ |
| @@ -183,6 +187,8 @@ public class SysMenuServiceImpl implements SysMenuService { | @@ -183,6 +187,8 @@ public class SysMenuServiceImpl implements SysMenuService { | ||
| 183 | SysMenuDO updateObject = SysMenuConvert.INSTANCE.convert(reqVO); | 187 | SysMenuDO updateObject = SysMenuConvert.INSTANCE.convert(reqVO); |
| 184 | initMenuProperty(updateObject); | 188 | initMenuProperty(updateObject); |
| 185 | menuMapper.updateById(updateObject); | 189 | menuMapper.updateById(updateObject); |
| 190 | + // 发送刷新消息 | ||
| 191 | + menuProducer.sendMenuRefreshMessage(); | ||
| 186 | } | 192 | } |
| 187 | 193 | ||
| 188 | /** | 194 | /** |