您当前所在位置:首页攻略Spring事件处理机制详解

Spring事件处理机制详解

更新:2024-10-24 10:18:46编辑:游戏资讯归类:攻略

Spring框架提供了完整的事件处理机制,内置了一些事件和监听的实现,并支持开发者扩展自定义事件和监听。

在实际项目开发中,基于事件的实现主要用于解耦和异步处理,可以提高应用的响应速度。

核心架构

Spring中实现自定义事件监听需要涉及的接口类,忽略异步引用和注解的实现,后续会进行介绍。

基本实现步骤

  1. 自定义事件:一般继承自ApplicationEvent即可,定义和实现自己的事件方法。
  2. 事件发布:业务代码中注入ApplicationEventPublisher类,然后在具体业务方法中调用publishEvent方法,传入自定义的事件和必要参数。
  3. 实现事件监听:实现ApplicationListener接口,泛型传入自定义的事件类型。

注意事项

  1. 异常和事务:事件的发布和监听处理默认与当前业务线程绑定,导致异常会影响当前业务,如果当前业务有事务,异常会导致回滚。
  2. 事件类型:必须监听自定义的事件,而不是监听基类或接口,同时在具体事件中可以定义其他参数,方便在具体方法中传参使用。
  3. 事件顺序:一次可以发布多个事件,执行顺序默认按照发布顺序。

场景应用

以订单完成和推送给平台订单相关数据为业务模型来举例说明。Spring4.2之后提供了注解来实现事件监听,非常方便,这里我们使用注解的方式实现监听。

  • 缩略的业务类:包含事件的发布
@Resource
private ApplicationEventPublisher publisher;

public void completeTrade(TradeOrder trade){
  tradeMapper.modifyStatus(trade);
  publisher.publishEvent(new TradeStatusEvent(this,new TradeStatusEvent.Params(trade,"完成订单")));
}
  • 具体事件的定义:继承自ApplicationEvent
public class TradeStatusEvent extends ApplicationEvent {
    private static final Logger logger = LoggerFactory.getLogger(TradeStatusEvent.class);

    private Params params;
    
    public Params getParams(){
      return this.params;
    }
    
    public TradeStatusEvent(Object source,Params param) {
        super(source);
        this.param = param;
    }
    
    public void send(){
      try{
        HttpUtils.send("xx.oo", PlatformBean.Builder().note(this.params.note)..build());
      } catch(Exception e){
        logger.error("TradeStatusEvent处理异常:",e);
      } 
    }
    
    
    public static class Params {
        private TradeOrder trade;
        private String note;
        //get、set 定义其他参数等
    }
}
  • 监听实现:使用注解,注意这里使用了 事务监听注解 ,按照具体业务场景可以选择具体的注解,比如最常用的@EventListener。因为我这里的诉求是当前事物提交完成之后再去推送消息,而且实际情况是启用了异步监听来实现,同时有的人在监听的方法中可能还执行了回查,也就是去查询业务中提交的数据,那如果这里不标记为事物提交之后执行,在异步情况下无法获取到数据。
@Component
public class TradeStatusEventListener {

    @TransactionalEventListener(phase= TransactionPhase.AFTER_COMMIT, fallbackExecution=true)
    void handlerAfterComplete(TradeStatusEvent event) {
        event.send();
    }
}

异步实现

异步实现指的是异步监听,将主体业务逻辑和消息监听任务放到不同的线程中执行,提高业务的响应速度。

Springboot中有多种方法来实现异步监听执行,最简单、最直接的就是和异步方法实现一模一样,只需在监听方法上加上@Async注解(前提是启用了异步执行)。

  • 第一种办法:在Configuration配置类中加上注解 @EnableAsync ,启用Spring的异步方法执行能力。然后在监听方法上加上 @Async 注解,标明此方法是异步执行。
@Configuration
@EnableAsync
public class AppConfig{}
//````
@Component
public class TradeStatusEventListener {

    @Async
    @TransactionalEventListener(phase= TransactionPhase.AFTER_COMMIT, fallbackExecution=true)
    void handlerAfterComplete(TradeStatusEvent event) {
        event.send();
    }
}
  • 第二种办法:如果不想全局开启异步,只是想给事件监听的代码实现异步任务,可以直接在监听哪里new Thread().start(),不受控、不优雅,但是业务场景简单、访问量小的情况下也是可以的。规范一点的做法是自己创建一个线程池,然后在event.send哪里使用executorService.execute(..)执行。
  • 第三种办法:创建SimpleApplicationEventMulticaster的Bean,然后创建一个线程池给塞进去,需要将自定义实现注入到Spring容器中。其他代码不用做任何修改,在事件发布的时候广播会使用multicastEvent调用taskExecutor获取一个线程去执行监听任务。
@Configuration
public class AppConfig{
  @Bean
  public SimpleApplicationEventMulticaster simpleApplicationEventMulticaster(){
        SimpleApplicationEventMulticaster mu = new SimpleApplicationEventMulticaster();
        //这里我使用spring提供的任务构造器创建了一个立即执行的有界队列任务线程池
        Executor taskExecutor = new TaskExecutorBuilder().corePoolSize(8).maxPoolSize(200).queueCapacity(20).threadNamePrefix("trade-send-").build();
        mu.setTaskExecutor(taskExecutor);
        //设置异常处理
        mu.setErrorHandler((t)->{
            //logger.error("==========调用平台发送消息方法失败,",t);
        });
    return mu;
  }
}

框架原理

  • 为什么异步监听只需要@EnableAsync、以及在方法上加上@Async就可以了呢?
    • 当使用Springboot引入starter时,会自动引入spring-boot-autoconfigure,此包里面实现了很多自动配置的功能,名字都是xxx AutoConfiguration ,比如我们要说的就是TaskExecutionAutoConfiguration,容器启动时会加载和创建默认的任务线程池,可以通过spring.task.execution开头属性来配置。需要注意的是,无论是否加入@EnableAsync注解TaskExecutionAutoConfiguration都会初始化一个默认的线程池,因为这个是全局的。


    • @EnableAsync的作用是在容器启动时,告诉Spring要支持异步处理任务了。Spring会为异步处理任务准备一个专门的拦截器。


    • 当加入了注解,Spring会按照配置将准备工作全部做完,实现开箱即用,一步到位。

总结

  • Spring事件模型的核心包括事件源、事件、广播器和监听器。
  • 事件机制支持同步和异步,使用异步监听时,推荐使用线程池管理线程,高效、稳定且易于维护。
  • 在Springboot中,通过注解的方式监听和启用异步,实际原理核心是观察者模式。

以上就是电脑114游戏给大家带来的关于Spring事件处理机制详解全部内容,更多攻略请关注电脑114游戏。

电脑114游戏-好玩游戏攻略集合版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

口碑反转!《伊苏10》Steam近期评测为“特别好评”! 琪琪的假期