- 1、添加消息监听器
/**
- 消息监听
-
- 可以传入多个 MessageListenerAdapter
*/ @Bean
RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory, MessageListenerAdapter messageListenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer(); // 监听所有库的key过期事件 container.setConnectionFactory(connectionFactory); // 可以添加多个 messageListener,配置不同的通道 container.addMessageListener(messageListenerAdapter, new PatternTopic(“user”));
return container;
}
所有的订阅消息,都需要在这里进行注册绑定,new PatternTopic(“user”),表示发布的主题信息
- 小插曲 前面我们学习了监听 key 过期事件,如果我们只需要监听当前库的 key 过期事件,可以这样写:
@Value(“${spring.redis.database}”)
public String redisDatabaseIndex;
先拿到我们项目中使用的 Redis 的库索引
// 监听当前库的key过期 container.addMessageListener(messageListenerAdapter, new PatternTopic(“keyevent@" + redisDatabaseIndex + ":expired”));
然后使用发布/订阅模式,订阅主题为:keyevent@0:expired 的消息,则表示订阅数据库索引为 0 的 key 过期事件,监听所有的库则为:keyevent@*:expired
- 2、绑定消息处理器
/**
- 消息监听器适配器,绑定消息处理器
-
- 可以配置多个 listenerAdapter,监听不同的通道
*/ @Bean
MessageListenerAdapter listenerAdapter(RedisMessageListener receiver) {
return new MessageListenerAdapter(receiver, “onMessage”);
}
也就是说,当我们订阅的频道,当有消息进来时,指定它的处理类以及处理方法
三、注入消息处理器
上面我们已经注入了 RedisMessageListener 消息处理器,并指定了处理方法 onMessage(),代码如下:
package com.zyxx.common.redis;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component; /**
- Redis 消息接收
- @Author Lizhou
**/ @Slf4j
@Component
public class RedisMessageListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) { // 接收的topic log.info(“channel:” + new String(pattern)); // 消息的POJO log.info(“message:” + message.toString());
}
}
需要实现 MessageListener 接口,重写 onMessage() 方法,然后就可以获取到通道以及消息了,从而进行我们的一些业务逻辑处理
四、操作API
在 RedisUtils 中,我们增加一个操作方法
/**
- 向通道发布消息
*/ public boolean convertAndSend(String channel, Object message) {
if (StringUtils.isBlank(channel)) {
return false;
}
try {
template.convertAndSend(channel, message);
log.info(“发送消息成功,channel:{},message:{}”, channel, message);
return true;
} catch (Exception e) {
log.info(“发送消息失败,channel:{},message:{}”, channel, message);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化
中…(img-1DZbl9CA-1711993868002)]
最后
终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化
[外链图片转存中…(img-YjcyXw4S-1711993868002)]