SpringBoot中@Async的作⽤
在Spring中,@Async这个注解⽤于标记的异步的⽅法。⽅法上⼀旦标记了这个⽅法,当其它线程调⽤这个⽅法时,就会开启⼀个新的线程去异步处理业务逻辑。
此注解的使⽤说明:
1、此注解可以⽤在⽅法上,也可以⽤在类上(如果⽤在类上,这个类中的所有的⽅法就是异步的)
2、使⽤此注解的⽅法的类对象,需要是spring管理下的bean对象
3、程序主类或此注解的主类上,需要开启启⽤异步配置,配置上@EnableAsync注解
以Spring boot 为例,启动类中增加@EnableAsync,
@EnableAsync
@SpringBootApplication
public class ManageApplication {
}
异步类:
@Componentspring boot是啥
public class MyAsyncTask {
@Async
public void asyncCpsItemImportTask(Long platformId, String jsonList){}
}
上⾯的配置会启⽤默认的执⾏器,异步执⾏指定的⽅法。
在业务场景中,有时需要使⽤⾃⼰定义的执⾏器来跑异步的业务逻辑,那该怎么办呢?
上⾯的改造后的代码如下:
@EnableAsync
@SpringBootApplication
public class ManageApplication {
@Bean("MyExecutor")
public TaskExecutor workExecutor1(){
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setThreadNamePrefix("parseMyTask");
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(30);
threadPoolTaskExecutor.setQueueCapacity(100);
threadPoolTaskExecutor.afterPropertiesSet();
return threadPoolTaskExecutor;
}
}
异步类:
@Component
public class MyAsyncTask {
@Async("MyExecutor")
public void asyncCpsItemImportTask(Long platformId, String jsonList){}
}
注:
1、@Async注解由于是异步执⾏的,在其调⽤数据库操作之时,将⽆法产⽣事务管理的控制。解决办法,可以把@Transactional注解放到内部的需要进⾏事务的⽅法上
2、异步的业务逻辑处理场景有两种,⼀个是不需要返回结果,另⼀种是需要接收返回结果。
不需要返回结果的⽐较简单,就不多说了。
需要接收返回结果的⽰例如下:
@Async("MyExecutor")
public Future<Map<Long, List>> queryMap(List ids) {
List<> result = businessService.queryMap(ids);
..............
Map<Long, List> resultMap = wHashMap();
...
return new AsyncResult<>(resultMap);
}
调⽤的⽅法⽰例:
private Map asyncCollectProcessAbilities(List<BindDeviceDO> bindDevices,
List<BindStaffDO> bindStaffs, String dccId) {
// 返回值
Future<Map<Long, List>> asyncResult = MyService.queryMap(ids);
try {
finalMap = ();
} catch (InterruptedException | ExecutionException e) {
...
}
return finalMap;
}
3、关于执⾏器
Spring⽤TaskExecutor和TaskScheduler接⼝提供了异步执⾏和调度任务的抽象。
Spring的TaskExecutor和urrent.Executor接⼝时⼀样的,这个接⼝只有⼀个⽅法execute(Runnable task)。
Spring已经内置了许多TaskExecutor的实现,没有必要⾃⼰去实现:
SimpleAsyncTaskExecutor 这种实现不会重⽤任何线程,每次调⽤都会创建⼀个新的线程。
SyncTaskExecutor 这种实现不会异步的执⾏
ConcurrentTaskExecutor 这种实现是urrent.Executor的⼀个adapter。
SimpleThreadPoolTaskExecutor 这种实现实际上是Quartz的SimpleThreadPool的⼀个⼦类,它监听Spring的声明周期回调。
ThreadPoolTaskExecutor 这是最常⽤最通⽤的⼀种实现。它包含了urrent.ThreadPoolExecutor的属性,并且⽤TaskExecutor进⾏包装。
默认是⽤代理去处理@Async的,因此,相同类中的⽅法调⽤带@Async的⽅法是⽆法异步的,这种情况仍然是同步。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论