运维开发网

Spring 异步执行之@Async揭秘

运维开发网 https://www.qedev.com 2020-12-01 12:54 出处:51CTO 作者:日常笔记
背景在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring3.x之后,就已经内置了@Async来完美解决这个问题,本文将完成介绍@Async的用法。何为异步调用?在解释异步调用之前,我们先来看同步调用的定义;同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结

背景

在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题,本文将完成介绍@Async的用法。

  1. 何为异步调用?

    在解释异步调用之前,我们先来看同步调用的定义;同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。

    例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕;如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了。

  2. 常规的异步调用处理方式

    在Java中,一般在处理类似的场景之时,都是基于创建独立的线程去完成相应的异步调用逻辑,通过主线程和不同的线程之间的执行流程,从而在启动独立的线程之后,主线程继续执行而不会产生停滞等待的情况。

Spring 异步执行Async简介

Spring中用@Async注解标记的方法,称为异步方法,其实就相当于我们自己在当前方法里面:new Thread(()-> System.out.println("hello world !"))。按@Async注解使用的基本方法:
br/>按@Async注解使用的基本方法:
br/>所使用的@Async注解方法的类对象应该是Spring容器管理的bean对象;

Spring 异步执行Async示例

Spring 异步执行之@Async揭秘

@EnableAsync相当于AsyncConfigurationSelector,根据@Configuration中的mode来决定产生异步的方式是ProxyAsyncConfiguration还是AspectJAsyncConfiguration,默认的模式是AdviceMode.PROXY。此时注册处理bean:AsyncAnnotationBeanPostProcessor
br/>@EnableAsync相当于AsyncConfigurationSelector,根据@Configuration中的mode来决定产生异步的方式是ProxyAsyncConfiguration还是AspectJAsyncConfiguration,默认的模式是AdviceMode.PROXY。此时注册处理bean:AsyncAnnotationBeanPostProcessor
Spring 异步执行之@Async揭秘

执行程序后控制台输出

calling MyBean#runTask() thread: main

Running task thread: SimpleAsyncTaskExecutor-1

result from task: task result

Spring 异步执行Async之AsyncConfigurer

Spring 异步执行之@Async揭秘

async注解没有指定executor

  • 如果AsyncConfigurer没有定义executor,则会去寻找spring托管的名为taskExecutor的executor,如果没有,则抛出NoSuchBeanDefinitionException,返回null,然后由AsyncExecutionInterceptor.getDefaultExecutor去new一个SimpleAsyncTaskExecutor,不过这个不是spring托管的
  • 如果AsyncConfigurer定义了executor,则这个也不是spring托管的 不是spring托管的executor,需要自己额外去监听事件,然后优雅关闭

    总结

    在Spring中,@Async这个注解用于标记的异步的方法。方法上一旦标记了这个方法,当其它线程调用这个方法时,就会开启一个新的线程去异步处理业务逻辑。简单的把@Async注解放到Bean的方法上就会使用不同的线程运行,也就是说,调用者执行此方法不用一直等待整个方法执行完毕。
    br/>简单的把@Async注解放到Bean的方法上就会使用不同的线程运行,也就是说,调用者执行此方法不用一直等待整个方法执行完毕。
    让我们开始使用JAVA的注解配置开启异步处理机制,只需要简单的加上@EnableAsync注解到配置类上即可。

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号