首页 > 其他分享 >CompletableFuture异步查询分页接口,拼装返回结果

CompletableFuture异步查询分页接口,拼装返回结果

时间:2024-12-26 13:30:43浏览次数:3  
标签:异步 allowMaxPageSize 拼装 futures 查询 future CompletableFuture orderInfoList

//2.否则异步分批次获取 分N次调用接口,获取数据,然后拼装返回。
Long total = rpcResult.getResult().getPageItemTotal();int totalPage =  (int) Math.ceil((double) req.getPageSize() / allowMaxPageSize);
List<CompletableFuture<List<PlanOrderDetailFromVcRes>>> futures = new ArrayList<>();for (int currentPage = 1; currentPage <= totalPage; currentPage++) {
    //用于lambda 表达式内部必须是final,所以currentPage不能直接用, 为每个线程创建新的finalCurrentPage
    int finalCurrentPage = currentPage;
    //由于gisOrderParam是共享的,set内容 有多线程安全问题,所以为每个线程新new一个 localParam
    PlanOrderDetailFromVcReq localParam = new PlanOrderDetailFromVcReq();
    BeanUtils.copyProperties(req, localParam);
    //每个分页查询都会被包装成一个CompletableFuture,并提交给线程池进行异步处理
    CompletableFuture<List<PlanOrderDetailFromVcRes>> future = CompletableFuture.supplyAsync(() -> {
        localParam.setPageIndex(finalCurrentPage);
        localParam.setPageSize(allowMaxPageSize);
        return getPageData(req,finalCurrentPage,allowMaxPageSize);
    }).exceptionally(e -> {
        log.error(" 查询订单信息异常", e);
        return Collections.emptyList();
    });
    futures.add(future);
}

//使用CompletableFuture.allOf()等待所有任务完成,然后将结果合并到最终的list中
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
        .thenAccept(v -> {
            for (CompletableFuture<List<PlanOrderDetailFromVcRes>> future : futures) {
                try {
                    List<PlanOrderDetailFromVcRes> orderInfoList = future.get();
                    if (CollectionUtils.isNotEmpty(orderInfoList)) {
                        list.addAll(orderInfoList);
                    }
                }
                catch (Exception e) {
                    log.info("交货计划查询 分批查询异常");
                }
            }
        })
        .join();

 

标签:异步,allowMaxPageSize,拼装,futures,查询,future,CompletableFuture,orderInfoList
From: https://www.cnblogs.com/amberJava/p/18632553

相关文章

  • flask 异步任务celery中运行ipython或python repl出现阻塞
    问题场景:上传文件调用上传文件接口,异步任务解析文件,解析中需要执行python代码,此时会出现阻塞启动celery命令celery-Aapp.celeryworker-Pgevent-c1--loglevelINFO-Qnltable代码:importloggingimporttimeimportdatetimefromceleryimportshared_taskfr......
  • C# 异步编程模型【代码之美系列】
    ......
  • 在.NET Core中使用异步多线程高效率的处理大量数据的一种解决方案
    目录一、引言二、假设场景三、解决方案四、示例代码一、引言处理大量数据是一个常见的需求,传统的同步处理方式往往效率低下,尤其是在数据量非常大的情况下。本篇将介绍一种高效的多线程异步处理大数据量的方法,通过边处理边消费的方式,极大地提高了处理效率,并且减少了内存开销。这......
  • 并发编程笔记九-异步编程
    一.前言        在Java编程那浩瀚无垠的知识海洋中,隐藏着一片深邃而神秘的领域——并发编程,它宛如一片广袤无边的深海,等待着勇敢的探索者去征服。过去的八节笔记,犹如一盏盏明亮的灯塔,引领着我们从浅滩一步步深入,共同见证了多线程的灵动、锁与AQS的精妙、阻塞队列的稳......
  • js语句放入异步队列的时机是哪个?
    在JavaScript中,异步操作是通过事件循环(EventLoop)和异步队列(也称任务队列或消息队列)来处理的。当一个异步操作(如setTimeout、setInterval、Promise、async/await等)被调用时,它的回调函数或执行逻辑并不会立即执行,而是会被放入异步队列中等待。以下是这些异步操作如何与异步队列交......
  • 相同功率的异步电机与永磁同步电机相比,哪个电机的设计成本高?
    在相同功率下,永磁同步电机的设计成本通常更高。一、永磁同步电机设计成本高的原因材料成本永磁同步电机需要使用永磁体,如钕铁硼等稀土永磁材料。这些稀土材料价格昂贵,其成本在电机总成本中占比较大。例如,高品质的钕铁硼永磁体每千克价格可能达到数百元,而且随着稀土资源的稀缺......
  • 永磁同步电机与异步感应电机各自的优缺点是什么?
    永磁同步电机的优势与局限优势显著永磁同步电机具有诸多显著优势。其节能效果突出,在转速高于额定转速时,仍能保持较高效率,相比传统异步电机,可大幅降低能耗。例如,在工业生产中驱动风机或泵类负载时,永磁同步电机在轻载区的效率远超异步电机,能有效节约能源成本。在功率输出方面,......
  • Spring Boot 集成 Kafka:构建高效的异步消息驱动系统
    SpringBoot集成Kafka:构建高效的异步消息驱动系统一、引言在当今分布式系统的架构中,异步消息处理扮演着至关重要的角色。Kafka作为一款高性能、高吞吐量的分布式消息队列,与SpringBoot框架的结合能够轻松实现系统间的解耦、异步通信以及流量削峰等功能,极大地提升系统......
  • 在鸿蒙环境中,关系型数据库的详细讲解(1)内含:数据库的创建,数据的插入同步(insert),异步(
    前言看这篇文章的应该有和我一样是大学生并且去了一个班并且在做一个结课项目吧,至于班的名字这里就不详细说了,那废话不多说直接进入正题1.为什么要用数据库1.1持久化数据存储使用数据库可以在应用断电,重启保持数据不丢失我在这里举个例子:你在王者*耀里面自定义了一个键......
  • 异步电机的控制是否还有研究的必要,是不是已经非常成熟了?
    随着工业现代化和自动化进程的加快,异步电机作为最为常见的电动机之一,广泛应用于各类机械设备和工业自动化系统中。异步电机因其结构简单、成本低廉、维护方便等优点而备受青睐。异步电机的基本原理与应用异步电机,又称感应电机,其工作原理基于电磁感应定律。电流通过定子绕组,产......