—— 基于 Lettuce 的发布与订阅
使用 Spring Data Redis 作为发布消息的方式听起来可能很奇怪,但是您将发现,Redis不仅提供NoSQL数据存储,而且还提供消息传递系统。
[TOC]
JMS
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
JMS消息通常有两种类型:
- 点对点(Point-to-Point):在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。被概括为:只有一个消费者将获得消息。
- 发布/订阅(Publish/Subscribe):发布/订阅消息系统支持一个
事件驱动模型
,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。被概括为:多个消费者可以获得消息。
环境/版本一览:
- 开发工具:Intellij IDEA 2018.2.2
- springboot: 2.0.5.RELEASE
- jdk:1.8.0_171
- maven:3.3.9
- spring-boot-starter-data-redis:2.0.5.RELEASE
- commons-pool2:2.5.0
1、pom.xml
1 | <dependencies> |
2、application.yml
1 | spring: |
3、message(消费者)
ReceiverOne.java
1 | package com.fatal.message; |
ReceiverTwo.java
1 | package com.fatal.message; |
4、config
Spring Data Redis 提供了所有与 Redis 发送和接收消息所需的组件。具体来说,您需要配置:
- A connection factory(连接工厂)
- A message listener container(消息监听器容器)
- A Redis template(RedisTemplate)
1 | package com.fatal.config; |
因为 ReceiverOne、ReceiverTwo 两个类是都是POJO,所以它需要包装在一个消息监听器适配器中(MessageListenerAdapter
),该适配器实现 MessageListener 接口 。消息监听适配器还配置为当消息到达时调用接收器上的用来接收消息的方法(receiveMessage
)。
5、controller
1 | package com.fatal.controller; |
6、显示
运行工程
发布消息
访问 sendRedisMessage 接口发布消息
POST:http://localhost:8080/message/sendRedisMessage
控制台
参考资料
SpringBoot非官方教程 | 第十四篇:在springboot中用redis实现消息队列
CountDownLatch 源码
See Also
The following guides may also be helpful:
总结
CountDownLatch介绍
CountDownLatch
一种同步辅助工具,允许一个或多个线程等到在其它线程中执行的一组操作完成为止。
使用给定的计数初始化CountDownLatch
。调用 await()
方法让线程阻塞,直到当前计数到达 0
触发 countDown()
方法的调用,释放所有等待的线程,再继续执行 await()
方法的后续调用。这是一种一次性现象——计数无法重置。如果需要重置计数的版本,可以考虑使用 Cyclicbarrier
。
用一个计数初始化的CountDownLatch
充当一个简单的开/关闩锁,或门:所有调用了 await()
方法的线程在门外等待直到其中一个线程调用了 countDown()
方法将门打开。 初始化为 N 的CountDownLatch
可用于让一个线程等待直到 N 个线程完成某些操作,或者某些操作完成 N 次。
CountDownLatch
一个有用的属性就是它不要求调用 countDown()
在继续之前等待计数达到 0
,它只是为了阻止任何线程在所有的线程都能通过之前继续通过 await()
(倒计时到 0 时,开门放一群或一只狗)
CountDownLatch原理
CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务。
注
:这里为了演示,才使用 CountDownLatch
的。使用时不必加上它。
详细了解 CountDownLatch
SpringBoot
的知识已经有前辈在我们之前探索了。比较喜欢的博主有:唐亚峰 | Battcn、方志朋的专栏、程序猿DD、纯洁的微笑。对这门技术感兴趣的可以去他们的博客逛逛。谢谢他们的分享~~
以上文章是我用来学习的Demo
,都是基于 SpringBoot2.x
版本。
源码地址: https://github.com/ynfatal/springboot2-learning/tree/master/chapter18