摘要:文章链接之事件驱动机制的简单使用之事件驱动机制的简单使用关于事件的发起与相应,在客户端的交互中可算是非常频繁的事情了,关于事件的发布订阅,在生态中,可谓是非常有名了,而也提供了事件机制,本文则主要介绍后端如何在的环境中,使用事件机制使用姿
文章链接:https://liuyueyi.github.io/hexblog/hexblog/2018/06/09/180609-Spring之事件驱动机制的简单使用/
Spring之事件驱动机制的简单使用关于事件的发起与相应,在客户端的交互中可算是非常频繁的事情了,关于事件的发布订阅,在Java生态中,EventBus可谓是非常有名了,而Spring也提供了事件机制,本文则主要介绍后端如何在Spring的环境中,使用事件机制
I. 使用姿势主要借助org.springframework.context.ApplicationEventPublisher#publishEvent(org.springframework.context.ApplicationEvent) 来发布事件,而接受方,则直接在处理的方法上,添加 @@EventListener注解即可
1. 事件定义发布一个事件,所以第一件事就是要定义一个事件,对Spring而言,要求自定义的事件继承自ApplicationEvent类, 一个简单的demo如下
public class NotifyEvent extends ApplicationEvent { @Getter private String msg; public NotifyEvent(Object source, String msg) { super(source); this.msg = msg; } }2. 发布事件
发布时间则比较简单,直接拿到ApplicationContext实例,执行publish方法即可,如下面给出一个简单的发布类
@Component public class NotifyPublisher implements ApplicationContextAware { private ApplicationContext apc; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.apc = applicationContext; } // 发布一个消息 public void publishEvent(int status, String msg) { if (status == 0) { apc.publishEvent(new NotifyEvent(this, msg)); } else { apc.publishEvent(new NewNotifyEvent(this, msg, ((int) System.currentTimeMillis() / 1000))); } } }3. 事件监听器
在方法上添加注解即可,如下
@Component public class NotifyQueueListener { @EventListener public void consumerA(NotifyEvent notifyEvent) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("A: " + Thread.currentThread().getName() + " | " + notifyEvent.getMsg()); } @EventListener public void consumerB(NewNotifyEvent notifyEvent) { System.out.println("B: " + Thread.currentThread().getName() + " | " + notifyEvent.getMsg()); } @EventListener public void consumerC(NotifyEvent notifyEvent) { System.out.println("C: " + Thread.currentThread().getName() + " | " + notifyEvent.getMsg()); } }II. 疑问及解答 1. 发布与监听器的关联
上面给出了使用的姿势,看起来并不复杂,也比较容易使用,但是一个问题需要在使用之前弄明白了,发布事件和监听器是怎么关联起来的呢?
根据方法的参数类型执行
那么如果发布者,推送的是一个NotifyEvent类型的事件,那么接收者是怎样的呢?
参数为NotifyEvent以及其子类的监听器,都可以接收到消息
测试用例如下:
NewNotifyEvent 继承自上面的NotifyEvent
public class NewNotifyEvent extends NotifyEvent { @Getter private int version; public NewNotifyEvent(Object source, String msg) { super(source, msg); } public NewNotifyEvent(Object source, String msg, int version) { super(source, msg); this.version = version; } }
然后借助上面的消息发布者发送一个消息
@Test public void testPublishEvent() throws InterruptedException { notifyPublisher.publishEvent(1, "新的发布事件! NewNotify"); System.out.println("---------"); notifyPublisher.publishEvent(0, "旧的发布事件! Notify"); }
输出结果如下,对于NewNotifyEvent, 参数类型为NotifyEvent的consumerA, consumerC都可以接收到
A: main | 新的发布事件! NewNotify C: main | 新的发布事件! NewNotify B: main | 新的发布事件! NewNotify --------- A: main | 旧的发布事件! Notify C: main | 旧的发布事件! Notify2. 消息接收的顺序
上面消息处理是串行的,那么先后顺序怎么确定? (下面的答案不确定,有待深入源码验证!!!)
先扫描到的bean先处理
同一个bean中,按精确匹配,先后定义顺序进行
3. 异步消费对于异步消费,即在消费者方法上添加一个@Async注解,并需要在配置文件中,开启异步支持
@Async @EventListener public void processNewNotifyEvent(NewNotifyEvent newNotifyEvent) { System.out.println("new notifyevent: " + newNotifyEvent.getMsg() + " : " + newNotifyEvent.getVersion()); }
配置支持
@Configuration @EnableAsync public class AysncListenerConfig implements AsyncConfigurer { /** * 获取异步线程池执行对象 * * @return */ @Override public Executor getAsyncExecutor() { return new ThreadPoolExecutor(5, 10, 1, TimeUnit.MINUTES, new LinkedBlockingQueueIII. 其他 一灰灰Blog: https://liuyueyi.github.io/he...(), new DefaultThreadFactory("test"), new ThreadPoolExecutor.CallerRunsPolicy()); } }
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
声明尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
扫描关注文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/69711.html
摘要:如果当前没有事件也没有定时器事件,则返回。相关资料关于的架构及设计思路的事件讨论了使用线程池异步运行代码。下一篇初窥事件机制的实现二中定时器的实现 在浏览器中,事件作为一个极为重要的机制,给予JavaScript响应用户操作与DOM变化的能力;在Node.js中,事件驱动模型则是其高并发能力的基础。 学习JavaScript也需要了解它的运行平台,为了更好的理解JavaScript的事...
摘要:使用了一个事件驱动非阻塞式的模型,使其轻量又高效。的包管理器,是全球最大的开源库生态系统。按照这个定义,之前所述的阻塞,非阻塞,多路复用信号驱动都属于同步。 系列文章 Nodejs高性能原理(上) --- 异步非阻塞事件驱动模型Nodejs高性能原理(下) --- 事件循环详解 前言 终于开始我nodejs的博客生涯了,先从基本的原理讲起.以前写过一篇浏览器执行机制的文章,和nodej...
摘要:一微服务概念微服务体系结构由轻量级松散耦合的服务集合组成。每个服务都有自己的计划测试发布部署扩展集成和独立维护。团队不必因为过去的技术决定而受到惩罚。用在这里是指将相关的服务通过聚合器聚合在一起,这个聚合器就是门面。 微服务架构现在是谈到企业应用架构时必聊的话题,微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活、更能适应现在需求快速变更的大环境。 一、微服务概念 微服...
摘要:由于是需要兼容的后台系统,该项目并不能使用到等技术,因此我在上的经验大都是使用原生的编写的,可以看见一个组件分为两部分视图部分,和数据部分。 在公司里帮项目组里开发后台系统的前端项目也有一段时间了。 vue这种数据驱动,组件化的框架和react很像,从一开始的快速上手基本的开发,到后来开始自定义组件,对element UI的组件二次封装以满足项目需求,期间也是踩了不少坑。由于将来很长一...
阅读 1963·2023-04-25 14:50
阅读 2890·2021-11-17 09:33
阅读 2586·2019-08-30 13:07
阅读 2818·2019-08-29 16:57
阅读 858·2019-08-29 15:26
阅读 3501·2019-08-29 13:08
阅读 1945·2019-08-29 12:32
阅读 3345·2019-08-26 13:57