前言
上一篇中讲了关于TaskExecutor
的一些相关知识,本篇就是实战篇,看看异步线程使如何使用的
正文
本篇文章使用springboot 2.2.1.RELEASE
一.前奏,直接使用,无任何配置
- 启动异步注解
在springboot启动类上添加注解@EnableAsync
1 |
|
- 使用@Async注解
在需要的方法上使用@Async注解:
1 |
|
- controller 调用
在controller层调用异步方法,注意,异步方法最好通过注入的方式调用,如果是同类方法或工具类方法,@Async可能不会取作用。
1 |
|
- 结果
1 |
|
- 问题
很多人到这里就差不多完事了,我第一次用springboot
的异步也是这样。其实这里还有问题:
- 为什么线程名字是
task-
,而不是很多博客所说的SimpleAsyncTaskExecutor-
- 为什么应用在启动时创建了一个名为:
applicationTaskExecutor
的Executor Service
- 原因
这是因为springboot版本的原因:
springboot2.1
版本新加入了明为TaskExecutionAutoConfiguration
的一个配置类,在没有实现Executor
的情况是会自动注入一个name
为applicationTaskExecutor
的ThreadPoolTaskExecutor
,具体属性可以点进去看一看,这里就不细说了,关键源码如下:
1 |
|
- 在
springboot2.1
版本之前,没有这个TaskExecutionAutoConfiguration
类,所以才会是网上很多博客所说的SimpleAsyncTaskExecutor
,具体的源码在下一篇文章中讲
二. ThreadPoolTaskExecutor
如何使用ThreadPoolTaskExecutor。
1 |
|
注意在使用@Async
注解时在注解里面带上参数:@Async("threadPoolTaskExecutor")
三. ConcurrentTaskExecutor
如何使用ConcurrentTaskExecutor。
1 |
|
注意在使用@Async
注解时在注解里面带上参数:@Async("concurrentTaskExecutor")
四 接口实现
AsyncConfig:这里需要实现AsyncConfigurer
接口并重写里面得接口
1 |
|
AsyncExceptionHandler:
1 |
|
这个直接使用,不用做其他操作
五 说明
- 上面列出的方式,可以根据自己的需求做出选择,最好选择一种
- 如果存在两种及以上,请在使用
@Async
时加上需要使用哪一个处理,如果没有指明使用哪一种处理,最后会默认使用SimpleAsyncTaskExecutor
来处理异步任务。
最后
本篇文章主要是使用方法,如何去使用springboot的异步线程。