首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springboot2.0整合redis_灰度发布的方式

springboot2.0整合redis_灰度发布的方式

作者头像
全栈程序员站长
发布2022-11-09 09:14:09
发布2022-11-09 09:14:09
60900
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

一、简介

二、注入消息发布/订阅

  • 1、添加消息监听器
代码语言:javascript
代码运行次数:0
运行
复制
/** * 消息监听 * <p> * 可以传入多个 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 过期事件,可以这样写:
代码语言:javascript
代码运行次数:0
运行
复制
@Value("${spring.redis.database}")
public String redisDatabaseIndex;

先拿到我们项目中使用的 Redis 的库索引

代码语言:javascript
代码运行次数:0
运行
复制
// 监听当前库的key过期
container.addMessageListener(messageListenerAdapter, new PatternTopic("__keyevent@" + redisDatabaseIndex + "__:expired"));

然后使用发布/订阅模式,订阅主题为:keyevent@0:expired 的消息,则表示订阅数据库索引为 0 的 key 过期事件,监听所有的库则为:keyevent@*:expired

  • 2、绑定消息处理器
代码语言:javascript
代码运行次数:0
运行
复制
/** * 消息监听器适配器,绑定消息处理器 * <p> * 可以配置多个 listenerAdapter,监听不同的通道 */
@Bean
MessageListenerAdapter listenerAdapter(RedisMessageListener receiver) { 
   
    return new MessageListenerAdapter(receiver, "onMessage");
}

也就是说,当我们订阅的频道,当有消息进来时,指定它的处理类以及处理方法

三、注入消息处理器

上面我们已经注入了 RedisMessageListener 消息处理器,并指定了处理方法 onMessage(),代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
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 中,我们增加一个操作方法

代码语言:javascript
代码运行次数:0
运行
复制
/** * 向通道发布消息 */
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);
e.printStackTrace();
}
return false;
}

这里的 channel 相当于 我们存入数据的时候的 key,如果该通道不存在,则会新建一个通道

五、测试

  • 1、测试用例
代码语言:javascript
代码运行次数:0
运行
复制
package com.zyxx.redistest;
import com.zyxx.redistest.common.RedisUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class RedisTestApplicationTests { 

@Autowired
private RedisUtils redisUtil;
@Test
void contextLoads() { 

String message = "Hello World!";
// 发送消息
redisUtil.convertAndSend("user", message);
}
}

我们向通道 user 发送了一条 “Hello World!” 的消息

  • 2、测试结果

可以看出,我们的消息发送成功,再看控制台

我们接收到通道 user 发送了一条 “Hello World!” 的消息

如您在阅读中发现不足,欢迎留言!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/190640.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月22日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、注入消息发布/订阅
  • 三、注入消息处理器
  • 四、操作API
  • 五、测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档