当前位置: 首页 > article >正文

基于java线程池和EasyExcel实现异步导出

基于java线程池和EasyExcel实现异步导出

1.controller层

@GetMapping("export")
public void exportExcel(HttpServletResponse response) throws IOException, InterruptedException {
    exportService.exportExcel(response);
}

2. service

    public void exportExcel(HttpServletResponse response) throws IOException, InterruptedException {
        //设置响应头
        setExportHeader(response);
        //查询总数
        Long count = salariesMapper.selectCount(null);
        //每页查询条数
        Long pageSize = 40000L;
        //计算总页数
        Long pageCount = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
        int pages = pageCount.intValue();
        //创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(pages);
        CountDownLatch countDownLatch = new CountDownLatch(pages);

        //根据分页数,使用线程池异步查询数据并封装到Map中,key为页码,value为分页数据
        Map<Integer, Page<Salaries>> pageMap = new HashMap<>();
        for (int i = 0; i < pages; i++) {
            int finalI = i;
            executorService.submit(() -> {
                Page<Salaries> page = new Page<>();
                page.setCurrent(finalI + 1);
                page.setSize(pageSize);
                Page<Salaries> selectPage = salariesMapper.selectPage(page, null);

                pageMap.put(finalI, selectPage);
                //计数器减一
                countDownLatch.countDown();
            });
        }
        //阻塞,等待所有线程执行完(计数器减到0为止)
        countDownLatch.await();
        executorService.shutdown();
        try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), Salaries.class).build()) {
            for (Map.Entry<Integer, Page<Salaries>> entry : pageMap.entrySet()) {
                Integer num = entry.getKey();
                Page<Salaries> salariesPage = entry.getValue();
                WriteSheet writeSheet = EasyExcel.writerSheet(num, "模板" + num).build();
                excelWriter.write(salariesPage.getRecords(), writeSheet);
            }
        }
        // https://github.com/alibaba/easyexcel/issues/1040
    }


http://www.kler.cn/a/519803.html

相关文章:

  • 景联文科技加入AIIA联盟数据标注分委会
  • C#新语法
  • 谈谈RTMP|RTSP播放器视频view垂直|水平反转和旋转设计
  • 【软件测试项目实战 】淘宝网:商品购买功能测试
  • 网易Android开发面试题200道及参考答案 (上)
  • Docker—搭建Harbor和阿里云私有仓库
  • 如何使用Java爬虫获取AliExpress商品详情:代码示例与实践指南
  • python爬虫框架Scrapy简介
  • C#牵手Blazor,解锁跨平台Web应用开发新姿势
  • 机器人学习的范式转变:从专用走向通用基础模型
  • C# 中使用Hash用于密码加密
  • AI Agent的多轮对话:提升用户体验的关键技巧
  • Linux之Tcp粘包笔记
  • Oracle之Merge into函数使用
  • 蓝桥杯LQ1044 求完数
  • 不同路径(62)
  • 机器学习 ---逻辑回归
  • 手撕B-树
  • python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算
  • 修改 Go 版本后不生效?深入排查与解决方案
  • 代码随想录刷题day16|(哈希表篇)349.两个数组的交集
  • LeetCode hot 热题100 二叉树的层序遍历
  • ollama部署及实践记录,虚拟环境,pycharm等
  • 树莓派安装步骤
  • 【win11】解决msrdc.exe窗口启动导致周期性失去焦点
  • 分布式微服务系统简述