首页 > 解决方案 > CompletableFuture - 跳过错误并仅获取验证数据

问题描述

如果 webclient 响应正常,我有一个特定的代码可以正常工作。如果有任何错误,则 get() 方法抛出错误并且线程永远阻塞。

@SneakyThrows
public List<ResponseData> validateExpression(List<RequestData> RequestDataList, Data data) {
    System.out.println(Instant.now());
    final List<Mono<ResponseData>> monoList = new ArrayList<>();
    RequestDataList.parallelStream().forEach(requestData -> {
        try {
            ObjectMapper mapper = new ObjectMapper();
            log.info("Diversity API request data:");
            log.info(mapper.writeValueAsString(requestData));
            Mono<ResponseData> monoResponse = webClient
                    .post()
                    .uri("http://...")
                    .contentType(MediaType.APPLICATION_JSON)
                    .header(API_KEY_HEADER, config.getApiKey())
                    .body(Mono.just(requestData), RequestData.class)
                    .retrieve()
                    .bodyToMono(ResponseData.class);
            System.out.println("create mono response lazy initialization");
            monoList.add(monoResponse);
        } catch (Exception e) {
            log.info(e.getMessage());
        }
    });
    System.out.println(Instant.now());
    CompletableFuture<List<ResponseData>> futureCount = new CompletableFuture<>();
    List<ResponseData> responseDataList = new ArrayList<>();
    Mono.zip(monoList, Arrays::asList)
            .flatMapIterable(objects -> objects)
            .doOnComplete(() -> {
                futureCount.complete(responseDataList);
            }).subscribe(responseData -> {
                responseDataList.add((ResponseData) responseData);
    });
   return futureCount.get();
}

它与成功的案例一起工作正常。如果 webclient 有任何错误,它会抛出错误并且线程永远被阻塞。如何跳过错误并仅获取验证响应数据?在这种情况下如何避免死锁?

标签: javaspring-boot

解决方案


您应该查看CompletableFuture::get方法的文档: 在此处输入图像描述

它抛出三个不同的检查异常。Lombok 的@SneakyThrows注释将它们隐藏起来,因此它们不受您的方法管理。您可能应该添加try/catch块来管理这些异常并在需要时跳过错误。


推荐阅读