使用CompletableFuture执行异步多线程任务时,需要进行跨平台调用出现的请求头丢失问题

业务场景
  • 使用微服务架构的模式下,异步开启多个任务进行各个服务的远程调用(比如:此时需要调用设备服务、基础数据服务、文件服务)
出现问题

远程调用时,出现空指针的问题(请求头丢失,导致空指针异常)

解决方案
  • 首先获取当前主线程请求头,再将主线程请求头共享给每一个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();
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。