业务场景
- 使用微服务架构的模式下,异步开启多个任务进行各个服务的远程调用(比如:此时需要调用设备服务、基础数据服务、文件服务)
出现问题
远程调用时,出现空指针的问题(请求头丢失,导致空指针异常)
解决方案
- 首先获取当前主线程请求头,再将主线程请求头共享给每一个CompletableFuture异步线程
// 获取当前线程请求头信息(解决丢失请求头问题)
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
// 每一个线程都来共享之前的请求数据
RequestContextHolder.setRequestAttributes(attributes);
你需要执行的方法
具体代码
- 比如说,我这里的业务需要先减少文件容量,再异步的进行文件删除业务操作
@Override
@Transactional(rollbackFor = Exception.class)
public R deleteBatch(List<Long> ids) throws BusException {
// 将文件容量进行减少
this.calculateDelFileCapacity(ids);
// 获取当前线程请求头信息(解决丢失请求头问题)
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
// 将关联信息全部删除
CompletableFuture[] completableFutures = ids.stream().map(item -> CompletableFuture
.supplyAsync(() -> getFileResourcesById(item), taskExecutor)
.whenComplete((res, e) -> {
if (e == null && res != null) {
// 每一个线程都来共享之前的请求数据
RequestContextHolder.setRequestAttributes(attributes);
fileResourcesAsyncService.recursionDeleteAsync(Arrays.asList(res));
}
}).exceptionally(e -> {
throw new BusException("删除文件资源异常", e);
})).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(completableFutures).join();
return R.suc();
}