使用redis实现发布订阅功能及问题

如何使用redis实现发布订阅及遇到的问题

使用背景:

服务A通过接口操作服务B,实现相应逻辑。生产环境上,服务A有两个pod,服务B有3个pod

通过接口调用时,请求只能打到服务B的一个pod上,而我们想要的是服务B的每个pod都能收到服务A发送的请求数据,所以使用redis的发布订阅来实现

实现方法:

1、发送方-服务A

构造需要发送的实体数据objectData

String jsonStr = JSONUtil.toJsonStr(objectData);

使用redisTemplate.convertAndSend("channel_operate",jsonStr);方法像指定的通道"channel_operate"中发送的数据为Object类型

2、接收方-服务B

1)redis配置类中,增加消息监听的逻辑

cpp 复制代码
/**
* 消息监听
*/
@Bean
public MessageListenerAdapter messageListenerAdapter(RedisSubscriber scriber){
    return new MessageListenerAdapter(scriber);
}

/**
* 消息监听容器
*/
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory,MessageListenerAdapter messageListenerAdapter){

    RedisMessageListenerContainer  container = new RedisMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.addMessageListener(messageListenerAdapter,new ChannelTopic("channel_operate"));
    return container;
}

2)增加订阅到的redis消息类

cpp 复制代码
@Component
public class RedisSubscriber  implements MessageListener {
     
     /**
     * 处理接收到的消息
     */
     public void onMessage(Message message){
         
         //接收到数据字符串
         String valueStr = message.toString();

         //去掉数据中的转义字符
         StringEscapeUtils.unescapeJava(valueStr);
         //如果处理后的数据开头和结尾有多余的字符,使用substring截取你需要的数据即可
         
         //转换为实体对象,JSONUtil是hutool-all包中的工具类
         JSONUtil.toBean();
         //处理自己的逻辑
         ......  
    }
}

代码咔咔写完了,然后就是启动服务测试逻辑了

。。启动报错了。。一个错误是说啥超时,另一个问题就是

java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/SubscriptionListener

提示就是加载SubscriptionListener这个类失败了,找不到,搜一圈之后各种尝试,然后找到了解决办法

说是redis包的问题,项目中用的是

cpp 复制代码
<dependency>
     <groupId>org.redisson</groupId>
     <artifactId>redisson-spring-boot-starter</artifactId>
</dependency>

需要改成

cpp 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
</dependency>

再启动就正常了

相关推荐
Teable任意门互动4 分钟前
多维表格本地化部署实践解析 企业如何实现数据自主可控路径
数据库·excel·钉钉·飞书·开源软件
四谎真好看6 分钟前
Redis学习笔记(高级篇2)
redis·笔记·学习·学习笔记
You Only Live Once_28 分钟前
SQLite3部署与配置[WIN11]
数据库·sqlite
光泽雨9 分钟前
mysql体系结构
数据库·mysql
云飞云共享云桌面10 分钟前
8-10位研发3D(sw、ug、creo)画图如何共享一台工作站?
运维·服务器·网络·数据库·3d·电脑
TDengine (老段)16 分钟前
TDengine IDMP 事件 —— 事件模板
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据
一只大袋鼠20 分钟前
数据库连接池从入门到精通(下):Druid 连接池使用与工具类封装
java·数据库·连接池
正在走向自律21 分钟前
时序数据库选型指南:在数据洪流中寻找坚实的锚点
数据库·时序数据库·apache iotdb
wljt23 分钟前
达梦数据库恢复数据
数据库·数据库开发
卓怡学长28 分钟前
基于 SpringBoot 的生活信息分享平台,从 0 到 1 完整实现(附源码 + 数据库)
java·数据库·spring boot·tomcat·maven