当前位置:   article > 正文

springBoot +redis 消息订阅与发布_springboot redis 发布和订阅功能

springboot redis 发布和订阅功能

1.引入redis依赖

  1. <!-- 集成redis依赖  -->
  2.         <dependency>
  3.             <groupId>org.springframework.boot</groupId>
  4.             <artifactId>spring-boot-starter-data-redis</artifactId>
  5.         </dependency>

2.创建RedisConfig

  1. @Configuration
  2. public class RedisConfig {
  3. @Bean
  4. public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  5. RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
  6. redisTemplate.setConnectionFactory(redisConnectionFactory);
  7. // 设置Key使用String序列化
  8. redisTemplate.setKeySerializer(new StringRedisSerializer());
  9. return redisTemplate;
  10. }
  11. @Bean
  12. public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
  13. RedisMessageListenerContainer container = new RedisMessageListenerContainer();
  14. container.setConnectionFactory(redisConnectionFactory);
  15. // 添加订阅者监听类,数量不限.PatternTopic定义监听主题,这里监听test-topic主题
  16. container.addMessageListener(new SubscribeListener(), new PatternTopic("test-topic"));
  17. return container;
  18. }
  19. }

3.订阅接收发布者的消息

  1. public class SubscribeListener implements MessageListener {
  2. /**
  3. * 订阅接收发布者的消息
  4. */
  5. @Override
  6. public void onMessage(Message message, byte[] pattern) {
  7. // 缓存消息是序列化的,需要反序列化。然而new String()可以反序列化,但静态方法valueOf()不可以
  8. System.out.println(new String(pattern) + "主题发布:" + new String(message.getBody()));
  9. }
  10. }

4.发布消息

  1. @Component
  2. public class PublishService {
  3. @Autowired
  4. StringRedisTemplate redisTemplate;
  5. /**
  6. * 发布方法
  7. * @param channel 消息发布订阅 主题
  8. * @param message 消息信息
  9. * @throws IOException
  10. * @throws ParseException
  11. * @throws ClassNotFoundException
  12. */
  13. public void publish(String channel, Object message)
  14. throws IOException, ParseException, ClassNotFoundException {
  15. // 该方法封装的 connection.publish(rawChannel, rawMessage);
  16. String timeStr1=LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  17. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
  18. Date date = sdf.parse(timeStr1);
  19. String userId = (String)StpUtil.getLoginId();
  20. MessageTable messageTable = new MessageTable();
  21. messageTable.setUserId(Integer.valueOf(userId));
  22. messageTable.setMessage(String.valueOf(message));
  23. messageTable.setCreationTime(date);
  24. File file = new File("E:/messgaFile/"+(int)(Math.random()*32)+"/"+userId+".txt");
  25. //判断文件夹是否存在
  26. if (!file.getParentFile().exists()) {
  27. //创建文件夹
  28. file.getParentFile().mkdirs();
  29. }
  30. //判断文件是否存在
  31. if(file.exists()){
  32. //删除文件
  33. file.delete();
  34. }
  35. //创建文件
  36. file.createNewFile();
  37. //MessageTable对象序列化过程
  38. FileOutputStream fos = new FileOutputStream(file);
  39. ObjectOutputStream oos = new ObjectOutputStream(fos);
  40. oos.writeObject(messageTable);
  41. oos.flush();
  42. oos.close();
  43. fos.close();
  44. //MessageTable对象反序列化过程
  45. FileInputStream fis = new FileInputStream(file);
  46. ObjectInputStream ois = new ObjectInputStream(fis);
  47. MessageTable st1 = (MessageTable) ois.readObject();
  48. ois.close();
  49. fis.close();
  50. redisTemplate.convertAndSend(channel, st1.getMessage());
  51. }
  52. }

5.controller层

  1. @RequestMapping("/contextLoads")
  2. @ResponseBody
  3. public void contextLoads(HttpServletRequest request,HttpServletResponse response)
  4. throws ParseException, IOException, ClassNotFoundException{
  5. String channel = request.getParameter("channel");//如:test-topic
  6. String message = request.getParameter("message");
  7. service.publish(channel,message);
  8. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/754511
推荐阅读
相关标签
  

闽ICP备14008679号