1. 进一步封装 Redis pub/sub 的能力,简化编程难度

2. 数据字典的本地缓存刷新
This commit is contained in:
YunaiV
2021-01-23 10:56:34 +08:00
parent c10ab1753a
commit dc42f0f1bb
18 changed files with 232 additions and 35 deletions

View File

@ -1,6 +1,6 @@
package cn.iocoder.dashboard.framework.redis.config;
import cn.iocoder.dashboard.framework.redis.core.listener.AbstractMessageListener;
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
@ -35,7 +35,7 @@ public class RedisConfig {
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory factory,
List<AbstractMessageListener<?>> listeners) {
List<AbstractChannelMessageListener<?>> listeners) {
// 创建 RedisMessageListenerContainer 对象
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
// 设置 RedisConnection 工厂。

View File

@ -1,7 +1,8 @@
package cn.iocoder.dashboard.framework.redis.core.listener;
package cn.iocoder.dashboard.framework.redis.core.pubsub;
import cn.hutool.core.util.ArrayUtil;
import cn.iocoder.dashboard.util.json.JSONUtils;
import lombok.SneakyThrows;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
@ -15,15 +16,21 @@ import java.lang.reflect.Type;
*
* @author 芋道源码
*/
public abstract class AbstractMessageListener<T> implements MessageListener {
public abstract class AbstractChannelMessageListener<T extends ChannelMessage> implements MessageListener {
/**
* 消息类型
*/
private final Class<T> messageType;
/**
* Redis Channel
*/
private final String channel;
protected AbstractMessageListener() {
@SneakyThrows
protected AbstractChannelMessageListener() {
this.messageType = getMessageClass();
this.channel = messageType.newInstance().getChannel();
}
/**
@ -31,7 +38,9 @@ public abstract class AbstractMessageListener<T> implements MessageListener {
*
* @return channel
*/
public abstract String getChannel();
public final String getChannel() {
return channel;
}
@Override
public final void onMessage(Message message, byte[] bytes) {
@ -56,7 +65,7 @@ public abstract class AbstractMessageListener<T> implements MessageListener {
Class<?> targetClass = getClass();
while (targetClass.getSuperclass() != null) {
// 如果不是 AbstractMessageListener 父类继续向上查找
if (targetClass.getSuperclass() != AbstractMessageListener.class) {
if (targetClass.getSuperclass() != AbstractChannelMessageListener.class) {
targetClass = targetClass.getSuperclass();
continue;
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.dashboard.framework.redis.core.pubsub;
import com.alibaba.fastjson.annotation.JSONField;
/**
* Redis Channel Message 接口
*/
public interface ChannelMessage {
/**
* 获得 Redis Channel
*
* @return Channel
*/
@JSONField(serialize = false) // 必须序列化
String getChannel();
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.dashboard.framework.redis.core.util;
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
import cn.iocoder.dashboard.util.json.JSONUtils;
import org.springframework.data.redis.core.RedisTemplate;
/**
* Redis 消息工具类
*
* @author 芋道源码
*/
public class RedisMessageUtils {
/**
* 发送 Redis 消息,基于 Redis pub/sub 实现
*
* @param redisTemplate Redis 操作模板
* @param message 消息
*/
public static <T extends ChannelMessage> void sendChannelMessage(RedisTemplate<?, ?> redisTemplate, T message) {
redisTemplate.convertAndSend(message.getChannel(), JSONUtils.toJSONString(message));
}
}