CompletableFuture批量执行异步任务

分页批量执行异步任务

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值