mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-30 09:48:43 +08:00 
			
		
		
		
	增加 Redis pub sub 机制
This commit is contained in:
		| @@ -1,13 +1,23 @@ | |||||||
| package cn.iocoder.dashboard.framework.redis.config; | package cn.iocoder.dashboard.framework.redis.config; | ||||||
|  |  | ||||||
|  | import cn.iocoder.dashboard.framework.redis.core.listener.AbstractMessageListener; | ||||||
| import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; | import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; | ||||||
|  | import lombok.extern.slf4j.Slf4j; | ||||||
| import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||||
| import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||||
| import org.springframework.data.redis.connection.RedisConnectionFactory; | import org.springframework.data.redis.connection.RedisConnectionFactory; | ||||||
| import org.springframework.data.redis.core.RedisTemplate; | import org.springframework.data.redis.core.RedisTemplate; | ||||||
|  | import org.springframework.data.redis.listener.ChannelTopic; | ||||||
|  | import org.springframework.data.redis.listener.RedisMessageListenerContainer; | ||||||
| import org.springframework.data.redis.serializer.RedisSerializer; | import org.springframework.data.redis.serializer.RedisSerializer; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Redis 配置类 | ||||||
|  |  */ | ||||||
| @Configuration | @Configuration | ||||||
|  | @Slf4j | ||||||
| public class RedisConfig { | public class RedisConfig { | ||||||
|  |  | ||||||
|     @Bean |     @Bean | ||||||
| @@ -23,4 +33,20 @@ public class RedisConfig { | |||||||
|         return template; |         return template; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Bean | ||||||
|  |     public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory factory, | ||||||
|  |                                                                        List<AbstractMessageListener<?>> listeners) { | ||||||
|  |         // 创建 RedisMessageListenerContainer 对象 | ||||||
|  |         RedisMessageListenerContainer container = new RedisMessageListenerContainer(); | ||||||
|  |         // 设置 RedisConnection 工厂。 | ||||||
|  |         container.setConnectionFactory(factory); | ||||||
|  |         // 添加监听器 | ||||||
|  |         listeners.forEach(listener -> { | ||||||
|  |             container.addMessageListener(listener, new ChannelTopic(listener.getChannel())); | ||||||
|  |             log.info("[redisMessageListenerContainer][注册 Channel({}) 对应的监听器({})]", | ||||||
|  |                     listener.getChannel(), listener.getClass().getName()); | ||||||
|  |         }); | ||||||
|  |         return container; | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -19,8 +19,6 @@ public class RedisKeyDefine { | |||||||
|         HASH, |         HASH, | ||||||
|         SET, |         SET, | ||||||
|         ZSET, |         ZSET, | ||||||
|         STREAM, |  | ||||||
|         PUBSUB; |  | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -0,0 +1,19 @@ | |||||||
|  | package cn.iocoder.dashboard.framework.redis.core.listener; | ||||||
|  |  | ||||||
|  | import org.springframework.data.redis.connection.MessageListener; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Redis Pub/Sub 监听器抽象类,用于实现广播消费 | ||||||
|  |  * | ||||||
|  |  * @author 芋道源码 | ||||||
|  |  */ | ||||||
|  | public abstract class AbstractMessageListener<T> implements MessageListener { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获得 Sub 订阅的 Redis Channel 通道 | ||||||
|  |      * | ||||||
|  |      * @return channel | ||||||
|  |      */ | ||||||
|  |     public abstract String getChannel(); | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,21 @@ | |||||||
|  | package cn.iocoder.dashboard.modules.system.mq.consumer; | ||||||
|  |  | ||||||
|  | import cn.iocoder.dashboard.framework.redis.core.listener.AbstractMessageListener; | ||||||
|  | import cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage; | ||||||
|  | import org.springframework.data.redis.connection.Message; | ||||||
|  | import org.springframework.stereotype.Component; | ||||||
|  |  | ||||||
|  | @Component | ||||||
|  | public class SysMenuRefreshConsumer extends AbstractMessageListener { | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onMessage(Message message, byte[] bytes) { | ||||||
|  |         System.out.println(message); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public String getChannel() { | ||||||
|  |         return SysMenuRefreshMessage.TOPIC; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1 @@ | |||||||
|  | package cn.iocoder.dashboard.modules.system.mq.message; | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | package cn.iocoder.dashboard.modules.system.mq.message.permission; | ||||||
|  |  | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 菜单数据刷新 Message | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | public class SysMenuRefreshMessage { | ||||||
|  |  | ||||||
|  |     public static final String TOPIC = "system.menu.refresh"; | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1 @@ | |||||||
|  | package cn.iocoder.dashboard.modules.system.mq.producer; | ||||||
| @@ -0,0 +1,26 @@ | |||||||
|  | package cn.iocoder.dashboard.modules.system.mq.producer.permission; | ||||||
|  |  | ||||||
|  | import cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage; | ||||||
|  | import org.springframework.data.redis.core.RedisTemplate; | ||||||
|  | import org.springframework.stereotype.Component; | ||||||
|  |  | ||||||
|  | import javax.annotation.Resource; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Menu 菜单相关消息的 Producer | ||||||
|  |  */ | ||||||
|  | @Component | ||||||
|  | public class SysMenuProducer { | ||||||
|  |  | ||||||
|  |     @Resource | ||||||
|  |     private RedisTemplate<String, Object> redisTemplate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 发送 {@link SysMenuRefreshMessage} 消息 | ||||||
|  |      */ | ||||||
|  |     public void sendMenuRefreshMessage() { | ||||||
|  |         SysMenuRefreshMessage message = new SysMenuRefreshMessage(); | ||||||
|  |         redisTemplate.convertAndSend(SysMenuRefreshMessage.TOPIC, message); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -11,6 +11,7 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysMenuMappe | |||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; | ||||||
| import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum; | import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum; | ||||||
| import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; | import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; | ||||||
|  | import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysMenuProducer; | ||||||
| import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; | import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; | ||||||
| import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; | import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; | ||||||
| import cn.iocoder.dashboard.util.collection.CollectionUtils; | import cn.iocoder.dashboard.util.collection.CollectionUtils; | ||||||
| @@ -68,6 +69,9 @@ public class SysMenuServiceImpl implements SysMenuService { | |||||||
|     @Resource |     @Resource | ||||||
|     private SysPermissionService permissionService; |     private SysPermissionService permissionService; | ||||||
|  |  | ||||||
|  |     @Resource | ||||||
|  |     private SysMenuProducer menuProducer; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 初始化 {@link #menuCache} 和 {@link #permMenuCache} 缓存 |      * 初始化 {@link #menuCache} 和 {@link #permMenuCache} 缓存 | ||||||
|      */ |      */ | ||||||
| @@ -183,6 +187,8 @@ public class SysMenuServiceImpl implements SysMenuService { | |||||||
|         SysMenuDO updateObject = SysMenuConvert.INSTANCE.convert(reqVO); |         SysMenuDO updateObject = SysMenuConvert.INSTANCE.convert(reqVO); | ||||||
|         initMenuProperty(updateObject); |         initMenuProperty(updateObject); | ||||||
|         menuMapper.updateById(updateObject); |         menuMapper.updateById(updateObject); | ||||||
|  |         // 发送刷新消息 | ||||||
|  |         menuProducer.sendMenuRefreshMessage(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV