1. Spring Async
想必大家都知道同步调用与异步调用的区别。
- 同步调用: 程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行。
- 异步调用: 无需等待上一步执行完,程序就可以接着执行后续的操作。
目前大部分Java应用都是通过同步的方式来实现交互处理的,但是某些场景下,如果一个主流程和一个本可以 “在后台执行” 的流程放在一起执行,此时使用同步调用则需要等待所有执行完毕,会导致响应迟缓,影响体验,此时我们应该使用异步调用。
非Spring项目实现异步调用的方式,通常是使用多线程,手动在主线程外创建独立线程去完成相应的异步调用逻辑。
Spring的异步线程组件@Async
主要实现主业务流程与附加业务逻辑的线程异步解耦。例如:
- 生成订单后,发送短信,通过在发送短信方法上使用Spring的
@Async
实现发送短信的异步化。 - 为了记录用户的日常行为,需要记录操作日志,通过在日志记录方法上使用Spring的
@Async
实现日志记录的异步化。
一个方法被带有Spring的@Async
注解标记时,表明该方法为 “异步方法” ,它会在单独的线程上运行。该方法的返回类型也会变为CompletableFuture<T>
。
2. 如何开启@Async
2.1. 基于Java Config
@Configuration
@EnableAsync
public class SpringAsyncConfig {
...
}
2.2. 基于SpringBoot
@EnableAsync
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2.3. 基于XML
<task:executor id="myexecutor" pool-size="5" />
<task:annotation-driven executor="myexecutor"/>