java - 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"));
}
我必须添加一些东西来保持/等待异步过程完成吗?我该怎么做呢?
解决方案
推荐阅读
- sql - Postgresql - 将字符串与空值进行比较
- javascript - 错误:尝试使用 nodemon 运行时找不到模块
- html - 在两个固定元素之间添加间距
- javascript - 如何在 datetimepicker 上添加多项选择功能
- asp.net-mvc - 从布局访问会话数据
- sql - 由于邮件服务器故障,无法将 SQL 邮件发送给收件人
- algorithm - 这个问题可以用组合数学来解决吗?
- node.js - Discord JS - TypeError:无法读取未定义的属性“setChannel”
- apache-spark - Pyspark - 根据单词列表检查列字符串并删除
- javascript - 为什么自动检测 otp 没有在 React 中渲染代码