java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Springboot异步事件配置

Springboot异步事件配置和使用示例详解

作者:冰雪女娲

Spring框架提供了一套事件处理机制,允许应用在各个组件之间传递状态信息,自定义事件通常继承自ApplicationEvent类,Springboot通过自动配置简化了异步处理的配置,实现开箱即用,Spring事件模型核心是观察者模式,适用于解耦和提高响应速度

Spring中提供了完整的事件处理机制,本身底层内置实现了一些事件和监听,同时支持开发者扩展自己的事件和监听实现。

一般这种基于事件的实现在项目实际开发中我们主要用来解耦,和做异步处理(默认是同步),提供应用的响应速度。

核心架构

先简要看一下,在Spring中要实现自定义事件监听需要涉及哪些接口类,这里忽略异步的引用、注解的实现,后面会说到。

image

基本实现步骤

注意事项

场景应用

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

@Resource
private ApplicationEventPublisher publisher;
public void completeTrade(TradeOrder trade){
  tradeMapper.modifyStatus(trade);
  publisher.publishEvent(new TradeStatusEvent(this,new TradeStatusEvent.Params(trade,"完成订单")));
}
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 定义其他参数等
    }
}
@Component
public class TradeStatusEventListener {
    @TransactionalEventListener(phase= TransactionPhase.AFTER_COMMIT, fallbackExecution=true)
    void handlerAfterComplete(TradeStatusEvent event) {
        event.send();
    }
}

异步实现

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

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

@Configuration
@EnableAsync
public class AppConfig{}
//````
@Component
public class TradeStatusEventListener {
    @Async
    @TransactionalEventListener(phase= TransactionPhase.AFTER_COMMIT, fallbackExecution=true)
    void handlerAfterComplete(TradeStatusEvent event) {
        event.send();
    }
}
@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;
  }
}

框架原理

当我们使用Springboot,引入starter时会自动引入spring-boot-autoconfigure,此包里面实现了很多自动配置的功能(约定大于配置)名字都是xxxAutoConfiguration,比如我们这里要说的就是TaskExecutionAutoConfiguration,容器启动的时候就会加载和创建默认的任务线程池,可以通过spring.task.execution开头属性来配置。需要注意的是,无论是否加入@EnableAsync注解TaskExecutionAutoConfiguration都会初始化一个默认的线程池,因为这个是全局的。

image

@EnableAsync的作用是在容器启动的时候,告诉Spring我可要支持异步处理任务了,你看着办。Spring所好的朋友,我给你准备了一个专门搞事的拦截器。

image

总结

到此这篇关于Springboot异步事件配置和使用的文章就介绍到这了,更多相关Springboot异步事件配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文