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

深圳牌申请网站空间网店代运营网

深圳牌申请网站空间,网店代运营网,深圳营销型网页设计公司,中国建设银行汕头支行网站文章目录 前言一、控制器层代码二、服务层代码三、代码亮点分析 前言 SpringBoot的同步excel导出方式中#xff0c;服务会阻塞直到Excel文件生成完毕#xff0c;如果导出数据很多时#xff0c;效率低体验差。有效的方案是将导出数据拆分后利用CompletableFuture#xff0c;… 文章目录 前言一、控制器层代码二、服务层代码三、代码亮点分析 前言 SpringBoot的同步excel导出方式中服务会阻塞直到Excel文件生成完毕如果导出数据很多时效率低体验差。有效的方案是将导出数据拆分后利用CompletableFuture将导出任务异步化并行使用easyExcel导出多个excel文件最后将所有文件压缩成ZIP格式以方便下载。 Springboot环境下基于以上方案下面代码的高质量的完成导出销售订单信息到Excel文件并将多个Excel文件打包成一个ZIP文件最后发送给客户端 一、控制器层代码 RestController public class SalesOrderController {Resourceprivate SalesOrderExportService salesOrderExportService;PostMapping(value /salesOrder/export)public void salesOrderExport(RequestBody Validated RequestDto req, HttpServletResponse response) {salesOrderExportService.salesOrderExport(req, response);}}二、服务层代码 负责执行销售订单的导出逻辑: 将多个Excel文件打包成ZIP文件多线程ThreadPoolTaskExecutor并行处理销售订单的导出 Slf4j Service public class SalesOrderExportService {AutowiredQualifier(threadPoolTask)private ThreadPoolTaskExecutor threadPoolTaskExecutor;Resourceprivate OrderManager OrderManager;public void salesOrderExport(RequestDto req, HttpServletResponse response) {// 获取导出数据,每个SalesOrder实例需要分别导出到一个excel文件ListSalesOrder orderDataList OrderManager.getOrder(req.getUserCode());// 略...校验数据InputStream zipFileInputStream null;Path tempZipFilePath null;Path tempDir null;// 获取导出模板try (InputStream templateInputStream this.getClass().getClassLoader().getResourceAsStream(template/order_template.xlsx);ByteArrayOutputStream outputStream new ByteArrayOutputStream();) {if (Objects.isNull(templateInputStream)) {throw new RuntimeException(获取模版文件异常);}// 多线程服用一个文件流IOUtils.copy(templateInputStream, outputStream);// 创建临时excel文件导出目录,用于将多个excel导出到此目录下Path tmpDirRef (tempDir Files.createTempDirectory(req.userCode() dir_prefix));// 每5个salesOrder一个线程并行导出到excel文件中CompletableFuture[] salesOrderCf Lists.partition(orderDataList, 5).stream().map(orderDataSubList - CompletableFuture.supplyAsync(() - orderDataSubList.stream().map(orderData - this.exportExcelToFile(tmpDirRef, outputStream, orderData)).collect(Collectors.toList()), threadPoolTaskExecutor).exceptionally(e - {throw new RuntimeException(e);})).toArray(CompletableFuture[]::new);// 等待所有excel文件导出完成CompletableFuture.allOf(salesOrderCf).get(3, TimeUnit.MINUTES);// 创建临时zip文件tempZipFilePath Files.createTempFile(req.userCode() TMP_ZIP_DIR_PRE, .zip);// 将excel目录下的所有文件压缩到zip文件中,zipUtil有很多工具包都有ZipUtil.zip(tempDir.toString(), tempZipFilePath.toString());response.setContentType(application/octet-stream;charsetUTF-8);response.setHeader(Content-Disposition, attachment;filename URLEncoder.encode(tempZipFilePath.toFile().getName(), utf-8));// 写zip文件流到responsezipFileInputStream Files.newInputStream(tempZipFilePath);IOUtils.copy(zipFileInputStream, response.getOutputStream());} catch (Exception e) {log.error(salesOrderExport,异常:, e);throw new RuntimeException(导出异常,请稍后重拾);} finally {try { // 关闭流if (Objects.nonNull(zipFileInputStream)) {zipFileInputStream.close();} // 删除临时文件及目录if (Objects.nonNull(tempDir)) {Files.walkFileTree(tempDir, new SimpleFileVisitorPath() {Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {Files.deleteIfExists(file);return FileVisitResult.CONTINUE;}Overridepublic FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {Files.deleteIfExists(dir);return FileVisitResult.CONTINUE;}});}if (Objects.nonNull(tempZipFilePath)) {Files.deleteIfExists(tempZipFilePath);}} catch (Exception e) {log.error(salesOrderExport, 关闭文件流失败:, e);}} 使用EasyExcel库基于模板导出每个销售订单到单独的Excel文件中 模板内容: /*** 导出单个excle文件,上面的多线程代码调用**/private Path exportExcelToFile(Path temporaryDir, ByteArrayOutputStream templateOutputStream, SalesOrder data) {Path temproaryFilePath null;try {// 创建临时文件 temproaryFilePath Files.createTempFile(temporaryDir, data.getOrderNo(), ExcelTypeEnum.XLSX.getValue());} catch (IOException e) {throw new RuntimeException(exportExcelToFile,创建excel临时文件失败: data.getOrderNo());}try (InputStream templateInputStream new ByteArrayInputStream(templateOutputStream.toByteArray());OutputStream temporaryFileOs Files.newOutputStream(temproaryFilePath);BufferedOutputStream tempOutStream new BufferedOutputStream(temporaryFileOs)) {// 使用easyExcel的模板功能导出订单数据到临时文件中 ExcelWriter excelWriter EasyExcel.write(tempOutStream, SalesOrder.class).withTemplate(templateInputStream).excelType(ExcelTypeEnum.XLSX).build();// 填充模板数据WriteSheet writeSheet EasyExcel.writerSheet().build();FillConfig fillConfig FillConfig.builder().forceNewRow(Boolean.TRUE).build();excelWriter.fill(new FillWrapper(goods, data.getGoodsList()), fillConfig, writeSheet);excelWriter.fill(data, writeSheet);excelWriter.finish();// temproaryFilePath.toFile().deleteOnExit();return temproaryFilePath;} catch (Exception e) {throw new RuntimeException(exportExcelToFile,导出excel文件失败: data.getOrderNo(), e);}}导出文件如下 三、代码亮点分析 多线程处理 通过CompletableFuture和ThreadPoolTaskExecutor将销售订单的导出任务分配给多个线程并行执行显著提高了处理大量订单时的性能。使用Lists.partition方法将订单列表分割成多个子列表每个子列表由一个线程处理这里每5个订单一个线程。 Excel模板导出 利用EasyExcel的模板功能可以基于预定义的Excel模板填充数据从而生成格式统一的销售订单Excel文件。模板文件通过类加载器的getResourceAsStream方法加载便维护。将多个Excel文件打包成一个ZIP文件方便用户下载和管理。 资源清理 方法执行完毕后及时关闭打开的文件流和删除临时生成的Excel文件和目录避免了资源泄露。使用try-with-resources和try-catch-finally来确保资源的正确关闭和清理。 错误处理 在方法执行过程中对可能出现的异常进行了捕获和处理确保服务的健壮。对于无法恢复的错误通过抛出运行时异常的方式通知调用者并记录了详细的错误日志。
http://www.hkea.cn/news/14260346/

相关文章:

  • 网站设计制作的服务和质量写作网站都有哪些
  • 网站搭建十大品牌公司同一网站相同form id
  • 清苑网站建设南京网站开发南京乐识专心
  • 个人网站介绍网页快照网站
  • 前端做微网站wordpress模板 家具
  • gta5购买房产网站正在建设邢台哪个公司做网站
  • 视频网站免费送会员怎么做需要注册的网站建设
  • 网站建设后台实训体会做pc端网站策划
  • 杭州手机模板建站大型网站 php
  • 玉环住房与城乡建设规划局网站WordPress更改logo插件
  • 郴州网站建设哪家做的好找人做网站需要注意什么
  • 网站更新维护建设和交通局网站
  • 免费网站404免费进入中国空间站研究项目
  • 山西运城网站建设windows不能用wordpress
  • wordpress添加网站地图无水印logo在线制作免费
  • 石家庄网站建设外包公司淘宝做网站 评价话语
  • 网站建设竞争性磋商文件用高权重网站的目录做站群怎么样
  • 个人域名可以备案企业网站吗企业 网站建设
  • wordpress付费商业站长沙3合1网站建设
  • 自助建站网站的宣传手册单位建设一个网站的费用
  • php零基础做网站推一把网络营销学院
  • 网站全站开发需要学什么济南最新防疫政策调整
  • 网站标题几个字合适石家庄网站托管
  • 做音乐网站首页要求最近最火的电商平台是哪个
  • 转转网站怎么建设新市区做网站
  • 做网页设计的网站做的网站图片不显示
  • 重生做网站的小说上海人才网官网入口
  • 丽水建设局网站文件电销客户数据怎么买
  • 网站建设最新建网站如何赚钱
  • 360建筑网 官方网站标小智在线logo免费设计