1、java1.8并行流调用,结合future
private List<MerchantWithRelation> batchQueryChildrenMerchantsMap(List<Long> merchantIdList,
List<SubMerchantType> subMerchantType) {
List<MerchantWithRelation> resultList = new CopyOnWriteArrayList<>();
Lists.partition(merchantIdList, 20).stream().map(parts -> {
QueryChildrenMerchantWithRelationTreeRequest request = QueryChildrenMerchantWithRelationTreeRequest.newBuilder()
.addAllMerchantIds(parts)
.addAllSubMerchantType(subMerchantType)
.build();
return merchantServiceFutureStub.queryChildrenMerchantsMapByMerchantIds(request);
}).collect(Collectors.toList()).forEach(future -> {
QueryMerchantTreeResponse response = null;
try {
response = future.get();
} catch (InterruptedException | ExecutionException e) {
log.error("merchantServiceFutureStub#queryChildrenMerchantsMapByMerchantIds interrupted exception, businessDepartmentItemIds:" + JsonUtil.toJson(merchantIdList), e);
Thread.currentThread().interrupt();
return;
} catch (Exception e) {
log.error("merchantServiceFutureStub#queryChildrenMerchantsMapByMerchantIds exception, businessDepartmentItemIds:" + JsonUtil.toJson(merchantIdList), e);
return;
}
if (response == null) {
log.error("merchantServiceFutureStub#queryChildrenMerchantsMapByMerchantIds is null, businessDepartmentItemIds:{}", JsonUtil.toJson(merchantIdList));
return;
}
if (!response.getIsSuccess()) {
log.error("merchantServiceFutureStub#queryChildrenMerchantsMapByMerchantIds failed, businessDepartmentItemIds:{},response:{}", JsonUtil.toJson(merchantIdList), JsonUtil.toJson(response));
return;
}
resultList.addAll(response.getMerchantWithRelationList());
});
return resultList;
}
2、CompletableFuture
LinkedList<CompletableFuture<Stream<MerchantWithRelation>>> futures = Lists.newLinkedList();
List<List<Long>> lists = Lists.partition(merchantIdList, 20);
for (List<Long> list : lists) {
futures.add(CompletableFuture.supplyAsync(() ->
ofNullable(queryChildrenMerchants(list,subMerchantType))
.orElse(Lists.newLinkedList())
.stream().filter(Objects::nonNull)));
}
List<MerchantWithRelation> merchantRelationList = futures.stream().flatMap(CompletableFuture::join).collect(toList());