首页 > 解决方案 > java - 如何在java中执行多个Future并在for循环之前等待它完成?

问题描述

嗨,我如何执行 3 个可调用函数,这样我就不必等待何时执行另一个进程,并且在某些时候我必须等待它们完成才能正确移动到我的下一行代码?这就是我所做的:

我有一个返回值作为 Callable 的函数:

public <T> Callable<List<T>> getDataFromOtherAPI(List<Long> ids, String url, Class<T> tClass){
    WebClient webClient = WebClient.create();

    //NOTE init mapper
    ObjectMapper mapper = new ObjectMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    //NOTE end of init mapper

    CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, tClass);

    List<T> object = webClient.post()
        .uri(url).body(Mono.just(ids), Object.class)
        .retrieve()
        .onStatus(HttpStatus::isError, res -> res.bodyToMono(ExceptionResponse.class)
                .onErrorResume(e -> Mono.error(new ResourceNotFound("Something Happened")))
                .flatMap(errorBody -> Mono.error(new ResourceNotFound(errorBody.getMessage())))
        )
        .bodyToMono(new ParameterizedTypeReference<List<T>>() {})
        .block();
    
    List<T> mappedClass = mapper.convertValue(object, listType);

    if(mappedClass.size() == 0) {
        throw new ResourceNotFound("Data in Url " + url + " not found");
    }

    return () -> mappedClass;
}

这就是我声明我的高管的方式:

@Autowired
@Qualifier("executor")
private AsyncTaskExecutor execs;

然后这是我尝试从函数中的另一个 api 调用的方法:

Future<List<PartnerDto>> initPartners = execs.submit(getDataFromOtherAPI(
            transDeliveryPlanningDtSoDtoPartnerIds, b2b.getPartnerSpecificId(), PartnerDto.class));
    
Future<List<PartnerShipmentDto>> initPartnerShipments = execs.submit(getDataFromOtherAPI(
            transDeliveryPlanningDtSoDtoPartnerShipmentIds, b2b.getPartnerShipmentSpecificId(), PartnerShipmentDto.class));
    
Future<List<ProductResponseDto>> initProduct = execs.submit(getDataFromOtherAPI(
            transDeliveryPlanningDtSoDetailDto, b2b.getProductSpecificId(), ProductResponseDto.class));
    
    //another much process
    
    //end of another much process
    
    //i have to hold over here before i continue into my next process to do some for loop :
    
    for(TransDeliveryPlanningDtSoDto e : d.getTransDeliveryPlanningDtSoDto()) {
                        
         PartnerDto latestPartner = new PartnerDto();
         PartnerShipmentDto latestPartnerShipment = new PartnerShipmentDto();
         TransSalesOrder latestSalesOrder = new TransSalesOrder();
        
         latestProduct = initProduct.stream().filter(so -> productId.equals(so.getId())).findAny().orElseThrow(() -> new ResourceNotFound("Product " + so.getIs() + " Not Found"));
         latestPartner = initPartners.stream().filter(partner -> partnerId.equals(partner.getId())).findAny().orElseThrow(() -> new ResourceNotFound("Partner " + partnerName + " Not Found"));
         latestPartnerShipment = initPartnerShipments.stream().filter(partnerShipment -> partnerShipmentId.equals(partnerShipment.getId())).findAny().orElseThrow(() -> new ResourceNotFound("PartnerShipment Not Found"));
        
        }

我必须添加一些东西来保持/等待异步过程完成吗?我该怎么做呢?

标签: javaasynchronouscompletable-futurecallable

解决方案


推荐阅读