当前位置: 首页 > news >正文

使用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配置类中,增加消息监听的逻辑

/**
* 消息监听
*/
@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消息类

@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包的问题,项目中用的是

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId>
</dependency>

需要改成

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId>
</dependency>

再启动就正常了

http://www.lryc.cn/news/472709.html

相关文章:

  • Debug日程工作经验总结日程常用
  • Apache Paimon主键表的一些最佳实践
  • React面试常见题目(基础-进阶)
  • AI赋能:开启你的副业创业之路
  • 前端文件上传组件流程的封装
  • 图像篡改研究
  • wlan的8种组网方式的区别
  • 取消element-ui中账号和密码登录功能浏览器默认的填充色,element-ui登录账号密码输入框禁用浏览器默认填充色问题
  • Postman:高效的API测试工具
  • 设计模式-观察者模式(代码实现、源码级别应用、使用场景)
  • 9种 Vuejs 常用事件修饰符与使用指南
  • 第十四题刮开有奖
  • vue3+vite使用dataV后项目运行报错、页面空白问题
  • PDF 【人工智能白皮书 】【大模型安全实践白皮书】【大模型白皮书】【大模型/深度学习/人工智能原理/心智学习】
  • 【vue】13.深入理解递归组件
  • 【OFDM】OFDM Radar Algorithms in Mobile Communication Networks
  • 如何检测java中的内存泄露及溢出,并预防?
  • kafka 如何减少数据丢失?
  • CTF-PWN: 虚表(vtable)
  • Redis 集群 总结
  • 2024校园交友系统构建指南/保姆版教程与技巧uniapp+php支持二开
  • NVR设备ONVIF接入平台EasyCVR视频分析设备平台视频质量诊断技术与能力
  • 系统思考—啤酒游戏经营决策沙盘
  • 组件封装思路
  • akshare股票涨跌停获取统计分析
  • 前端对一个增删改查的思考
  • 【Clickhouse】客户端连接工具配置
  • 【测试平台】打包 jenkins配置和jenkinsfile文件
  • Leetcode224 -- 基本计算器及其拓展
  • python的lambda实用技巧