(建议初学者把这个系列前面的都看看,那对于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的消息订阅和发布的使用。