分页批量执行异步任务
private List<Data> getDataListByBatch(DataQuery dataQuery, int totalSize) {
List<Data> dataList= new CopyOnWriteArrayList<>();
int totalPage = getTotalPage(totalSize);
List<Integer> pageNumbers = getPageNumbers(totalPage);
log.info("++++++++ getDataListByBatch() -> request: {}, totalSize: [{}], totalPage: [{}] ++++++++",
JSON.toJSONString(dataQuery), totalSize, totalPage);
StopWatch stopWatch = new StopWatch();
stopWatch.start();
CompletableFuture[] completableFutures = pageNumbers.stream()
.map(pageNumber -> CompletableFuture
.supplyAsync(() -> {
PagePo<List<Data>> listPage = getListPagePo(dataQuery, pageNumber, MAX_BATCH_QUERY_SIZE);
return Objects.nonNull(listPage) ? listPage.getBodyList() : new ArrayList<Data>();
}, exportServiceExecutor)
.whenComplete((bodyList, throwable) -> {
if (!ObjectUtils.isEmpty(bodyList)) {
dataList.addAll(bodyList);
}
})).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(completableFutures).join();
stopWatch.stop();
log.info("++++++++ getDataListByBatch() -> stopWatch: {}ms ++++++++", stopWatch.getTotalTimeMillis());
return dataList;
}
/**
* 处理总页数
*
* @param totalSize
* @return
*/
private int getTotalPage(int totalSize) {
return (totalSize % MAX_BATCH_QUERY_SIZE == 0)
? (totalSize / MAX_BATCH_QUERY_SIZE)
: (totalSize / MAX_BATCH_QUERY_SIZE + 1);
}
/**
* 获取页数
*
* @param totalPage
* @return
*/
private List<Integer> getPageNumbers(int totalPage) {
int pageNumber = 1;
List<Integer> pageNumbers = Lists.newArrayList();
while (pageNumber <= totalPage) {
pageNumbers.add(pageNumber++);
}
return pageNumbers;
}
批量执行异步任务并获取返回结果代码 :
List<CompletableFuture<List<Object>>> completableFutureList = Lists.newArrayList();
for (String consumerId : map.keySet()) {
CompletableFuture<List<Object>> rowsFuture = CompletableFuture.supplyAsync(() -> {//执行代码
}, analysisExecutor);
completableFutureList.add(rowsFuture);
}
CompletableFuture<Void> allFutures = CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()]));
CompletableFuture<List<List<Object>>> listCompletableFuture = allFutures.thenApply(v -> completableFutureList.stream().map(CompletableFuture::join).collect(Collectors.toList()));
List<List<Object>> rows = listCompletableFuture.get(20, TimeUnit.SECONDS);