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

(Redis使用系列) Springboot 实现Redis消息的订阅与分布 四

(建议初学者把这个系列前面的都看看,那对于redis的基本使用操作及一些消息的订阅分布都是没问题的了)

Redis,一个缓存数据库。不仅仅是能用于对数据的CRUD,也可以作为一个消息中间件,用来进行消息的分发和订阅。

话不多说,我们直接进入代码part:

使用springboot去实现Redis的消息订阅与发布,前提是你的项目已经能正常连接上redis了,这里就不做连接介绍了(不清楚的可以去看这个系列的前面几篇)。

 

消息推送:

建一个controller,

@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("sendRedisMessageTest")
public String SendRedisMessage() {

    System.out.println("Sending message...");
    //第一个参数是,消息推送的主题名称;第二个参数是,要推送的消息信息
    //"chat"->主题 
    //"我是一条消息"->要推送的消息
    stringRedisTemplate.convertAndSend("chat", "我是一条消息");
    return  "Send Success" ;
}

 没错,到这里,使用redis作为中间件,推送消息到主题“chat” ,已经完成了!

怎么知道是不是推成功了?

我们接着写代码,实现redis消息的订阅来验证下!

 消息订阅:

既然是消息的订阅,那肯定是一个监听者的形式了,无时无刻他都在等待有没有收到消息,而消息,来自于某个主题。

先建一个消息监听,然后配置下,(代码里面的Receiver是消息接收类,在下面有代码。)

 RedisMessageListener.java :

/**
 * @Author : JCccc
 * @CreateTime : 2019-1-2
 * @Description :
 * @Point: Keep a good mood
 **/
@Configuration
public class RedisMessageListener {

    /**
     * redis消息监听器容器
     * 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
     * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
     * @param connectionFactory
     * @param listenerAdapter
     * @return
     */

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //订阅了一个叫chat 的通道
        container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
        //这个container 可以添加多个 messageListener
        //container.addMessageListener(listenerAdapter, new PatternTopic("这里是监听的通道的名字"));
        return container;
    }
    /**
     * 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
     * @param receiver
     * @return
     */
    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver) {
        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用“receiveMessage”
        //也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
        //receiveMessage就是对应消费者那边的消费方法吗,而Receiver是自己弄的一个消费者类
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }
    

}

显然,不需要再做解释,因为注释非常详细了。

继续,写一个消息接收类,

Receiver.java

/**
 * @Author : JCccc
 * @CreateTime : 2019-1-2
 * @Description :
 * @Point: Keep a good mood
 **/

    /**
     * redis消息处理器
     */
@Component
public class Receiver {
    private static final Logger LOGGER = LoggerFactory.getLogger(Receiver.class);

        /**
         * 接收到消息的方法,message就是指从主题获取的消息,主题配置在RedisMessageListener配置类做配置
         * @param message
         */
    public void receiveMessage(String message) {
        TestService testService=new TestService();
        //testService.getData();
        LOGGER.info("Received <" + message + ">");

    }
}

OK,运行一下项目,看看效果:

用postman调用下发布消息的接口,

 

 再看看控制台的反应:

收到了。

好了,本次介绍到此结束。

PS: redis的消息订阅和发布可以结合定时器、异步线程、AOP日志记录等等可扩展的,本文只是纯介绍redis的消息订阅和发布的使用。 

相关文章:

  • JAVA 责任链设计模式
  • JAVA回调函数简单讲解 CallBack
  • JAVA HttpClient 远程调用接口doGet、doPost工具类
  • JAVA 接口签名sign生成 工具类
  • mybatis-config配置文件各项简单介绍
  • Springboot整合Mybatis增删查改、连接MYSQL数据库及配置druid连接池
  • JAVA 模板设计模式
  • Springboot 最简单的结合MYSQL数据实现EXCEL表格导出及数据导入
  • Springboot中使用GSON报错 An attempt was made to call the method com.google.gson.GsonBuilder.setLenient
  • IDEA @AutoWired注入bean 出现红色波浪线
  • JAVA 最常用实用的正则表达式校验
  • Springboot 整合WebFlux 实现RESTFUI风格API 及简单的CRUD
  • Springboot 读取配置文件application.properties (yml)的四种方式
  • Springboot 指定获取自己写的配置properties文件的值
  • JAVA AES加密解密工具类
  • Apache的基本使用
  • JavaScript HTML DOM
  • Javascript 原型链
  • java中的hashCode
  • js继承的实现方法
  • Python 基础起步 (十) 什么叫函数?
  • Ruby 2.x 源代码分析:扩展 概述
  • Service Worker
  • Vim Clutch | 面向脚踏板编程……
  • Vue.js 移动端适配之 vw 解决方案
  • WinRAR存在严重的安全漏洞影响5亿用户
  • Zepto.js源码学习之二
  • 编写高质量JavaScript代码之并发
  • 初识 webpack
  • 对象引论
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 温故知新之javascript面向对象
  • 一起参Ember.js讨论、问答社区。
  • 一些关于Rust在2019年的思考
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • k8s使用glusterfs实现动态持久化存储
  • 整理一些计算机基础知识!
  • ​比特币大跌的 2 个原因
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #define用法
  • #NOIP 2014# day.2 T2 寻找道路
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2)nginx 安装、启停
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (转)可以带来幸福的一本书
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .CSS-hover 的解释
  • .NET文档生成工具ADB使用图文教程
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .stream().map与.stream().flatMap的使用
  • [.net]官方水晶报表的使用以演示下载