本文介绍了如何使用@Async注解来完成异步操作,从而加快执行速度
配置
@EnableAsync
, asyncExecutor
bean
Appliction.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
@EnableAsync public class { @Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { return BuildflowUtil.getJsonConverter(); } @Bean @Autowired public LibraryApiService libraryApiService(RestTemplateBuilder builder){ return new LibraryApiService(builder); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public Executor asyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(4); executor.setMaxPoolSize(4); executor.setQueueCapacity(500); executor.setThreadNamePrefix("Fetch podlist-"); executor.initialize(); return executor; } }
|
使用
在需要异步执行的函数上添加 @Async
注解, 并使得该函数返回 CompletableFuture
:
1 2 3 4 5
|
@Async public CompletableFuture<List<MsaRecordVo>> getMsaRecord(EnvironmentDto environment, List<ReleaseMsaDto> msaDtos, String refUrl, int envNum) { ...... return CompletableFuture.completedFuture(msaRecordVos); }
|
将所有异步执行的函数添加到一个CompletableFutur的list中:
1 2 3 4
|
List<CompletableFuture<List<MsaRecordVo>>> futures = new LinkedList<>(); ......
futures.add(environmentService.getMsaRecord(environment, msaDtos, releaseRepositoryUrl, environmentNumber));
|
待所有异步操作结束后, 合并结果
1 2 3 4 5 6 7 8 9 10
|
CompletableFuture<Void> allDoneFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
List<List<MsaRecordVo>> results = allDoneFuture.thenApply( v -> futures .stream() .map(CompletableFuture::join) .collect(Collectors.toList()) ).get();
msaRecordVos = results.stream().flatMap(x->x.stream()).collect(toList());
|
近期评论