業(yè)務場景
- 使用微服務架構的模式下昵观,異步開啟多個任務進行各個服務的遠程調用(比如:此時需要調用設備服務晾腔、基礎數(shù)據(jù)服務、文件服務)
出現(xiàn)問題
遠程調用時啊犬,出現(xiàn)空指針的問題(請求頭丟失灼擂,導致空指針異常)
解決方案
- 首先獲取當前主線程請求頭,再將主線程請求頭共享給每一個CompletableFuture異步線程
// 獲取當前線程請求頭信息(解決丟失請求頭問題)
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
// 每一個線程都來共享之前的請求數(shù)據(jù)
RequestContextHolder.setRequestAttributes(attributes);
你需要執(zhí)行的方法
具體代碼
- 比如說觉至,我這里的業(yè)務需要先減少文件容量剔应,再異步的進行文件刪除業(yè)務操作
@Override
@Transactional(rollbackFor = Exception.class)
public R deleteBatch(List<Long> ids) throws BusException {
// 將文件容量進行減少
this.calculateDelFileCapacity(ids);
// 獲取當前線程請求頭信息(解決丟失請求頭問題)
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
// 將關聯(lián)信息全部刪除
CompletableFuture[] completableFutures = ids.stream().map(item -> CompletableFuture
.supplyAsync(() -> getFileResourcesById(item), taskExecutor)
.whenComplete((res, e) -> {
if (e == null && res != null) {
// 每一個線程都來共享之前的請求數(shù)據(jù)
RequestContextHolder.setRequestAttributes(attributes);
fileResourcesAsyncService.recursionDeleteAsync(Arrays.asList(res));
}
}).exceptionally(e -> {
throw new BusException("刪除文件資源異常", e);
})).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(completableFutures).join();
return R.suc();
}