背景
有时我们在项目中需要聚合多个接口成一个接口给前端提供数据. 使用并行会提升性能. 在spring 中提供的@Async 可以异步执行.
编码
CompletableFuture<AppMachineInfoV3Dto> todaySummaryCount = machineTodaySummaryAggregatorService
.getMachineTodayInfo(licenseId);
CompletableFuture<LGAppDeviceTodayDurationDto> todaySummaryTimePeriod = machineTodaySummaryAggregatorService
.getTodaySummaryTimePeriod(licenseId);
CompletableFuture.allOf(todaySummaryCount, todaySummaryTimePeriod).join();
- 异步执行
@Async
public CompletableFuture<AppMachineInfoV3Dto> getMachineTodayInfo(String licenseId) {
try {
long start = System.currentTimeMillis();
AppMachineInfoV3Dto info = machineInfoFacade.getEHomeMachineTodayInfo(licenseId);
if (log.isDebugEnabled()) {
log.debug("getTodaySummaryCount cost {} ms", System.currentTimeMillis() - start);
}
if (info == null) {
return CompletableFuture.completedFuture(new AppMachineInfoV3Dto());
}
return CompletableFuture.completedFuture(info);
} catch (Exception e) {
log.error("call getTodaySummaryCount failed.", e);
return CompletableFuture.completedFuture(new AppMachineInfoV3Dto());
}
}
join 后是等待所有的都返回数据.
todaySummaryTimePeriod.get() 获取到返回值