您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

SpringEvent的应用

时间:2022-08-08 14:40:01  来源:  作者:小柴学Java

前言

该文章是我学习使用SpirngEvent的过程,现在只写了SpringEvent的应用,后续会写一篇从源码关注SpringEvent的实现过程。

SpringEvent的介绍

SpringEvent在我认为是一个解决业务解耦的办法,运用了观察者模式,用于 当一个业务的更改后,需要改变其他业务的状态 。例如一个商品的下单,需要修改商品的库存,以及商家的消息发送等等。之前我做这种业务解耦的时候,使用的时消息队列进行解耦,但如果只是为了解耦而整合了消息队列,就有点大了,我认为,可以使用此方式需要满足下面的条件:

  • 当做完业务的时候,不清楚有多少个子业务要进行更改,例如安防设备的报警,初期可能只是发送消息到持有设备的用户,页面显示报警状态,后期或许会涉及到同步到其他平台业务、和其他安防设备产生连锁报警业务等等。

SpringEvent的应用

环境配置

JDK8

Spring boot 2.6.10

业务场景

当电脑启动的时候,电脑的自启程序需要启动,程序的服务也需要启动等等。

实现

创建ComputerStartEvent电脑启动事件类

/** * 电脑启动事件类 */public class ComputerStartEvent extends ApplicationEvent {    private ComputerEntity computerEntity;    public ComputerEntity getComputerEntity() {        return computerEntity;    }    public ComputerStartEvent(ComputerEntity source) {        super(source);        this.computerEntity=source;    }}复制代码

创建AutoStartupSoftwareListener自启软件启动监听类

/**** 自启软件启动监听类*/@Componentpublic class AutoStartupSoftwareListener implements ApplicationListener<ComputerStartEvent> {    @Override    public void onApplicationEvent(ComputerStartEvent event) {        ComputerEntity computer=event.getComputerEntity();        System.out.println("电脑"+computer.getName()+"的自启软件正在进行");    }}复制代码

创建ProgramServiceStartupListener程序服务启动监听类

/** * 程序服务启动监听类 */@Componentpublic class ProgramServiceStartupListener implements ApplicationListener<ComputerStartEvent> {    @Override    public void onApplicationEvent(ComputerStartEvent event) {        ComputerEntity computer=event.getComputerEntity();        System.out.println("电脑"+computer.getName()+"的程序服务正在启动");    }}复制代码

客户端代码

poublic class ComputerService {    @Resource    private ApplicationEventPublisher applicationEventPublisher;    public void computerStart() {        ComputerEntity computer=new ComputerEntity();;        computer.setComputerId("dafdasf");        computer.setName("电脑A");        // 电脑启动操作        System.out.println(computer.getName()+"电脑启动了");                //发布电脑启动事件        applicationEventPublisher.publishEvent(new ComputerStartEvent(computer));    }}复制代码

效果

 

异步实现

目前有两种方式可以实现异步,

  • 一种是使用@EnableAsync和@Async启动异步。
  • 一种是给Springboot的默认实现 SimpleAsyncEventMulticaster 类中的 taskExecutor 字段赋值一个线程池。

一、使用@EnableAsync和@Async启动异步

下面为了演示异步的效果,自启软件的监听类不使用异步,程序服务的监听类使用异步,然后每个方法打印当前线程的Id。

AutoStartupSoftwareListener自启软件启动监听类

/*** 自启软件启动监听类*/@Componentpublic class AutoStartupSoftwareListener implements ApplicationListener<ComputerStartEvent> {    @Override    public void onApplicationEvent(ComputerStartEvent event) {        ComputerEntity computer=event.getComputerEntity();        System.out.println("电脑"+computer.getName()+"的自启软件正在进行");        //打印线程Id        System.out.println("AutoStartupSoftwareListener监听线程id:"+Thread.currentThread().getId());    }}复制代码

ProgramServiceStartupListener程序服务启动监听类

/** * 程序服务启动监听类 */@EnableAsync@Componentpublic class ProgramServiceStartupListener implements ApplicationListener<ComputerStartEvent> {    @Override    @Async    public void onApplicationEvent(ComputerStartEvent event) {        ComputerEntity computer=event.getComputerEntity();        System.out.println("电脑"+computer.getName()+"的程序服务正在启动");        //打印线程Id        System.out.println("ProgramServiceStartupListener监听线程id:"+Thread.currentThread().getId());    }}复制代码

客户端代码

poublic class ComputerService {    @Resource    private ApplicationEventPublisher applicationEventPublisher;    public void computerStart() {        ComputerEntity computer=new ComputerEntity();;        computer.setComputerId("dafdasf");        computer.setName("电脑A");        // 电脑启动操作        System.out.println(computer.getName()+"电脑启动了");                //发布电脑启动事件        applicationEventPublisher.publishEvent(new ComputerStartEvent(computer));        //打印线程Id        System.out.println("computerStart方法线程id:"+Thread.currentThread().getId());    }}复制代码

效果

 

异步启用成功

二、给SimpleAsyncEventMulticaster类中的taskExecutor字段赋值线程池

创建SimpleAsyncEventMulticaster继承SimpleApplicationEventMulticaster

//需要指定下beanName@Component("applicationEventMulticaster")public class SimpleAsyncEventMulticaster extends SimpleApplicationEventMulticaster {    public SimpleAsyncEventMulticaster(){        ThreadPoolTaskExecutor taskExecutor=new ThreadPoolTaskExecutor();        taskExecutor.initialize();        taskExecutor.setCorePoolSize(5);        taskExecutor.setMaxPoolSize(100);        taskExecutor.setQueueCapacity(1000);        taskExecutor.setThreadNamePrefix("test-async");        setTaskExecutor(taskExecutor);    }}复制代码

效果

 

两种异步的区别

如果给
SimpleAsyncEventMulticaster 的 taskExecutor 字段赋值线程池,所有监听类的执行都会是异步的,如果想要个别的任务执行是异步的话,需要重写
SimpleAsyncEventMulticaster 的 multicastEvent 方法,而使用@Async则不会,这也是为啥推荐的都是@Async方式实现异步。

总结

本文章介绍了SpringEvent和应用条件以及实例,这里没有写源码的解析,因为比较长,上述内容如果有误人子弟的地方,望在评论区留言。



Tags:SpringEvent   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言该文章是我学习使用SpirngEvent的过程,现在只写了SpringEvent的应用,后续会写一篇从源码关注SpringEvent的实现过程。SpringEvent的介绍SpringEvent在我认为是一个解决业...【详细内容】
2022-08-08  Tags: SpringEvent  点击:(86)  评论:(0)  加入收藏
▌简易百科推荐
说明目前重点放在别的东西上,所以这个插件不再更新,只能用于pc端,移动端自己可以fork进行优化。Installyarn add vue-draggingHow to use普通html<script src="./vue.js"></scr...【详细内容】
2022-10-21  桥湾村的希望  今日头条  Tags:Vue   点击:(7)  评论:(0)  加入收藏
大厂技术 坚持周更 精选好文本文为来自 教育-智能学习-前端团队成员的文章,已授权 ELab 发布。智能学习前端团队自创立以来,团队专注于打破大众对教育的刻板印象,突破固有的教...【详细内容】
2022-10-14  ELab  今日头条  Tags:Tauri   点击:(11)  评论:(0)  加入收藏
根据官方的文档说明:Spring Data JPA - Reference Documentation 可以在查询的参数后面添加 True 或 False 来进行查询。例如,如果需要对下面的参数进行查询:True findByAct...【详细内容】
2022-10-11  松鼠工厂  今日头条  Tags:Spring   点击:(12)  评论:(0)  加入收藏
使用过Spring Data操作ES的小伙伴应该有所了解,它只能实现一些非常基本的数据管理工作,一旦遇到稍微复杂点的查询,基本都要依赖ES官方提供的RestHighLevelClient,Spring Data只...【详细内容】
2022-10-11  Java编程指南    Tags:MyBatis   点击:(22)  评论:(0)  加入收藏
概念IOC:控制反转。从前需要在程序中创建对象实例;现在则通过一个外部的容器统一动态创建spring IOC 容器中的实例如何动态加载Condition:只有在特定条件满足时才加载举例 @Con...【详细内容】
2022-10-10  小技术酱  今日头条  Tags:Springboot   点击:(96)  评论:(0)  加入收藏
简介在项目中,存在传递超大 json 数据的场景。直接传输超大 json 数据的话,有以下两个弊端 占用网络带宽,而有些云产品就是按照带宽来计费的,间接浪费了钱 传输数据大导致网络...【详细内容】
2022-10-10    网易号  Tags:Springboot   点击:(22)  评论:(0)  加入收藏
简介Tokio 是 Rust 世界里最著名的异步执行框架,该框架包罗了几乎所有异步执行的接口,包括但不限于文件、网络和文件系统管理。在这些方便使用的高层接口之下则是一些“基石...【详细内容】
2022-10-07  达坦科技DateLord  今日头条  Tags:Tokio   点击:(19)  评论:(0)  加入收藏
/ 前言 /我收回标题上的话,从0手撸一个框架一点也不轻松,需要考虑的地方比较多,一些实现和细节值得商榷,是一个比较大的挑战,有不足的地方欢迎大佬们提供意见/ 依赖任务加载 /平...【详细内容】
2022-10-07  Meta多元宇宙  今日头条  Tags:框架   点击:(20)  评论:(0)  加入收藏
一、全局配置自定义1、代码配置 方式一:让父子上下文ComponentScan重叠(强烈不建议使用) @Configurationpublic class StockFeignConfiguration { /** * 日志级别...【详细内容】
2022-10-07  Java架构师知识  今日头条  Tags:Spring Cloud   点击:(16)  评论:(0)  加入收藏
摘要:本文介绍了Sermant Agent的接入原理和如何使用Sermant Agent无修改接入CSE。 本文分享自华为云社区《【技术干货】Spring Cloud应用零代码修改接入华为云微服务引擎CSE-...【详细内容】
2022-10-06  华为云开发者联盟  今日头条  Tags:Spring Cloud   点击:(23)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条