导出问题处理

问题描述

测试出来一个问题,使用地市的角色,导出数据然后超过了20w的数据,提示报错,我还以为是偶然的问题,然后是发现是普遍的问题,本地环境复现了,然后是,这个功能是三套角色,分别是集团,省份,地市。我用集团,省份角色查了这个地市,导出数据没有问题,然后我就好奇了。
报错问题

2024-10-22 15:17:05.612 ERROR 38604 --- [ XNIO-1 task-38] c.a.a.c.AssetDetailsQueryLocalController : exception's message:68
2024-10-22 15:18:59.375  INFO 38604 --- [ XNIO-1 task-38] cn.chinaunicom.ams.utils.EasyExcelUtils  : 压缩完成,耗时:5877 ms
2024-10-22 15:18:59.504 ERROR 38604 --- [ XNIO-1 task-38] cn.chinaunicom.core.util.CephUtil        : exception's message:java.io.FileInputStream.open0(Native Method)
2024-10-22 15:18:59.511 ERROR 38604 --- [ XNIO-1 task-38] cn.chinaunicom.core.util.CephUtil        : exception's message:上传文件:对象名export\2024\10\22\资产明细报表_20241022_151557260.xlsx,全路径file/ams/export\2024\10\22\资产明细报表_20241022_151557260.xlsx
2024-10-22 15:18:59.512 ERROR 38604 --- [ XNIO-1 task-38] c.a.a.c.AssetDetailsQueryLocalController : exception's message:cn.chinaunicom.core.util.CephUtil.uploadExportFile(CephUtil.java:191)

代码描述

 /*** 资产全量报表查询-导出资产全量报表信息 期间查询* @param response* @param request* @param requestBody*/@ResponseBody@PostMapping("/exportDetailViewListPeriodName")@ApiOperation(value = "资产全量报表查询-导出资产全量报表信息", notes = "资产全量报表查询-导出资产全量报表信息")@OperateLog("资产全量报表查询-导出资产全量报表信息")@RsaDecrypt(msg = "查询失败", isModuleSign = true, moduleName = "AssetDetailsQueryAllRequestBody")public void exportDetailViewListPeriodName(AssetDetailsQueryLocalRequestBody requestBody,HttpServletResponse response, HttpServletRequest request) {try {//j后台取值 账簿信息List<String> bookTypeCodeList = constantAbtOracleService.getBookTypeCodes("1");/*** 账簿后台获取*/if(bookTypeCodeList.size() == 1){requestBody.setBookTypeCode(bookTypeCodeList.get(0));}String condition = assetDetailsQueryLocalService.queryViewListForExportcondition(requestBody);if(StringUtils.isNotBlank(requestBody.getManufacturerName())){requestBody.setManufacturerName(URLDecoder.decode(requestBody.getManufacturerName()));}long start = System.currentTimeMillis();int count = 0;//批量资产编号String[] assetNumberStr = null;if (requestBody.getAssetNumbers() != null && !("").equals(requestBody.getAssetNumbers())) {assetNumberStr = requestBody.getAssetNumbers().split(",");}requestBody.setAssetNumberStr(assetNumberStr);//批量资产标签号String[] tagNumberStr = null;if (requestBody.getTagNumbers() != null && !("").equals(requestBody.getTagNumbers())) {tagNumberStr = requestBody.getTagNumbers().split(",");}requestBody.setTagNumberStr(tagNumberStr);Date nowTime = new Date();// 往数据库存储的路径(不含配置的前缀路径)String dbSavePath = "export" + File.separator + new SimpleDateFormat("yyyy").format(nowTime)+ File.separator + new SimpleDateFormat("MM").format(nowTime)+ File.separator + new SimpleDateFormat("dd").format(nowTime)+ File.separator;// 临时文件实际保存路径String fileSavePath = ExportExcelUtils.getImplementTemplate(request) + dbSavePath;// 获取保存路径,没有对应目录的话自行创建String savePath = FileUtil.createDir(fileSavePath);Date d = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");String dateNowStr = sdf.format(d);AssetExportFile exportFile = new AssetExportFile();String fileName="";String fileType="";String fileNameInfo="";fileNameInfo = "资产明细报表_";fileName=fileNameInfo+dateNowStr;exportFile.setFileName(fileName);//导出临时文件的命名String filePathFront= savePath + "资产明细报表_" + dateNowStr;// 数据库里存的文件路径即上传到云平台的文件命名exportFile.setFilePath(filePathFront);NowUser nowUser = WebUtil.getNowUser();exportFile.setCreatedBy(nowUser.getStaffId());Date date = new Date();SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//导出文件记录中新增一条记录exportFile.setCreatedDate(sdf1.format(date));exportFile.setExportStatus(FlowUtils.EXPORT_START);exportFile.setCreateName(nowUser.getStaffName());exportFile.setFileCondition(condition);final int file1 = exportFileService.insertExportFile(exportFile);String exportFileId = exportFile.getId();//            String endChar = requestBody.getBookTypeCode().substring(3,5);String endChar = assetDetailsQueryAllService.getTableNameByBookTypeCode(requestBody.getBookTypeCode());String periodName = requestBody.getPeriodName().replace("-","");requestBody.setTableName("CAMS_ASSET_DETAIL_" + endChar+"_"+periodName);//1、根据查询条件获取集合-erpList<AssetDetailsExcel> result=new ArrayList<>();//返回结果//开始查询的行数long startTime = System.currentTimeMillis();try{//1、根据查询条件获取集合-erpresult = assetDetailsQueryLocalService.queryViewListForExportPeriodName(requestBody);}catch(Exception exception){log.error("导出数据异常:" + exception);}long endTime = System.currentTimeMillis();count=result.size();if(count>FlowUtils.COUNT_FOR_TYPE){//生成zip格式fileName=fileNameInfo+dateNowStr+".zip";fileType=FlowUtils.ZIP_TYPE;exportFile.setFileType(fileType);}else{// 生成xlsx格式fileName= fileNameInfo+dateNowStr+".xlsx";fileType=FlowUtils.XLSX_TYPE;exportFile.setFileType(fileType);}exportFile.setFileName(fileName);// 导出临时文件最终命名和路径String finalFilePath = filePathFront + "." + fileType;//上传到服务器的实际文件的命名String finalFileName = dbSavePath + "资产明细报表_" + dateNowStr + "." + fileType;// 数据库里存的文件路径即上传到云平台的文件命名exportFile.setFilePath(finalFileName);log.error("exception's message:{}", String.valueOf((endTime - startTime) / 1000));//一个excel的总数据量int oneExcelSize = FlowUtils.ONE_EXCEL_SIZE;//需导出的总数据量int resultCount = result.size();//计算需要导出的excel的个数int excelCount = resultCount%oneExcelSize==0?resultCount/oneExcelSize:(resultCount/oneExcelSize +1);//声明fileList,大小为excelCountfinal List<File> resultFileList = new ArrayList<>(excelCount);EasyExcelUtils easyExcelUtils = new EasyExcelUtils();if (excelCount>1){// 多个文件,多线程并发写入for(int i=0;i<excelCount;i++){resultFileList.add(null);}for(int i=0;i<excelCount;i++){final int index =i;// 按每个excel的数据量大小来切分查询结果listfinal List<AssetDetailsExcel> res = resultCount<(index+1)*oneExcelSize?result.subList(index*oneExcelSize,resultCount):result.subList(index*oneExcelSize,(index+1)*oneExcelSize);//文件命名String excelFileName = savePath+"资产明细报表_"+dateNowStr+"-"+String.valueOf(i+1)+".xlsx";File file = new File(excelFileName);resultFileList.set(index,file);EasyExcel.write(excelFileName,AssetDetailsExcel.class).sheet("sheet").doWrite(res);}// 压缩文件final File file = easyExcelUtils.compressFile(resultFileList, true, exportFileId, filePathFront);} else {EasyExcel.write(finalFilePath,AssetDetailsExcel.class).sheet("sheet").doWrite(result);}//文件上传到慧企平台 --todoCephUtil.uploadExportFile(finalFileName, finalFilePath);//文件上传到慧企平台后删除临时文件 todoboolean resultTemp = valueSetController.executeFile(finalFilePath);// 更新导出文件记录exportFile.setId(exportFileId);exportFile.setExportStatus(FlowUtils.EXPORT_DONE);exportFileService.updateStatusFileNameById(exportFile);long end = System.currentTimeMillis();} catch (Exception e) {log.error("exception's message:{}",e.getStackTrace());}}/*** 本地文件上传到ceph** @param objName 上传上去的对象名(经测试长度不能超1024)* @param fileAllPath 将要上传的本地文件全路径* @return*/public static boolean uploadExportFile(String objName, String fileAllPath) throws IOException {FileInputStream fis = null;try {AmazonS3 conn = connCeph();File file = new File(fileAllPath);int imageSize = 0;try {fis = new FileInputStream(file);imageSize = fis.available();} catch (Exception e) {log.error("exception's message:{}",e.getStackTrace());}ObjectMetadata om = new ObjectMetadata();om.setContentLength(imageSize);conn.putObject(DEFAULT_BUCKET_NAME, objName, fis, om);if (ONLINE.equals("true")) {fis = new FileInputStream(file);AmazonS3 conn2 = connCeph2();conn2.putObject(DEFAULT_BUCKET_NAME2, objName, fis, om);log.error("exception's message:{}", "上传文件:对象名" + objName + ",全路径" + fileAllPath);return true;}} catch (Exception e) {log.error("exception's message:{}", "上传文件:对象名" + objName + ",全路径" + fileAllPath);} finally {fis.close();}return false;}

问题处理

真的找了好久,想到了一个思路才发现了问题处理,首先,这个报错提示是找不到文件,然后开始倒查。首先,这个功能是,有三套前端,两套后端,然后这也是我后面反应过来的问题,问题是出现在地市的角色上,地市角色使用本功能因为数据量在20w,增加一个条件之后导出了300条数据,直到我一条一条debug,发现提示找不到文件,然后在删除文件之前我去debug,找了具体的问题。
在这里插入图片描述
在这里插入图片描述
直到发现了这个问题,我才想起来,之前我改了一版,修改的是最大的文件数是从100000变成了300000,然后发现我只改了一个静态变量,只改了一个文件的判断是不是最多条的数量,但是一个excel中的最大条数还是100000,然后就提示报错了,该说不说这个问题我真的找了好久,因为确实是文件找不到报错的地方。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/57835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32-S3学习笔记:常用的ESP-IDF命令总结

参考资料&#xff1a;1.esptool.py工具 2.idf.py工具 后续文章的讲解需要用到IDF命令行工具&#xff0c;当前文章简单介绍一下。 目录 打开命令行的小技巧 一、读flash信息 二、擦除flash 三、读flash数据 四、写flash数据 打开命令行的小技巧 大家安装完IDF开发包后…

React类组件详解

React类组件是通过创建class继承React.Component来创建的&#xff0c;是React中用于构建用户界面的重要部分。以下是对React类组件的详细解释&#xff1a; 一、定义与基本结构 类组件使用ES6的class语法定义&#xff0c;并继承自React.Component。它们具有更复杂的功能&#xf…

腾讯云 COS 多 AZ 存储保证服务高可用性

腾讯云 COS 的多 AZ 存储架构能够为用户数据提供数据中心级别的容灾能力。多 AZ 存储将客户数据分散存储在城市中多个不同的数据中心&#xff0c;当某个数据中心因为自然灾害、断电等极端情况导致整体故障时&#xff0c;多 AZ 存储架构依然可以为客户提供稳定可靠的存储服务。 …

表格编辑demo

<el-form :model"form" :rules"status ? rules : {}" ref"form" class"form-container" :inline"true"><el-table :data"tableData"><el-table-column label"计算公式"><templat…

ArcGIS001:ArcGIS10.2安装教程

摘要&#xff1a;本文详细介绍arcgis10.2的安装、破解、汉化过程。 一、软件下载 安装包链接&#xff1a;https://pan.baidu.com/s/1T3UJ7t_ELZ73TH2wGOcfpg?pwd08zk 提取码&#xff1a;08zk 二、安装NET Framework 3.5 双击打开控制面板&#xff0c;点击【卸载程序】&…

05方差分析续

文章目录 1.Three way ANOVA2.Latin square design2.Hierarchical (nested) ANOVA3.Split-plot ANOVA4.Repeated measures ANOVA5.Mixed effect models 1.Three way ANOVA 三因素相关分析 单因子分析的代码 data(mtcars) nrow(mtcars) # 32 mtcars$cyl as.factor(mtcars$cyl…

c#子控件拖动父控件方法及父控件限在窗体内拖动

一、效果 拖放位置不超过窗体四边,超出后自动靠边停靠支持多子控件拖动指定控件拖放(含父控件或窗体)点击左上角logo弹出消息窗口(默认位置右下角)1.1 效果展示 1.2 关于MQTTnet(最新版v4.3.7.1207)实现在线客服功能,见下篇博文 https://github.com/dotnet/MQTTnet 网上…

BIO,NIO,直接内存,零拷贝

前置知识 什么是Socket&#xff1f; Socket是应用层与TCP/IP协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作系统提供。在设计模式中&#xff0c;Socket其实就是一个门面模式&#xff0c;它把复杂的TCP/IP协议处理和通信缓存管理等等都隐藏在Sock…

莱维飞行(Levy Flight)机制的介绍和MATLAB例程

文章目录 莱维飞行机制算法简介自然现象中的应用优化问题中的应用关键公式 MATLAB代码示例代码说明运行结果 莱维飞行机制算法的应用前景1. 自然科学中的应用2. 计算机科学中的应用3. 工程技术中的应用4. 金融与经济学中的应用5. 医疗与生物信息学中的应用6. 未来研究方向 结论…

【软件工程】软件工程入门

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;软件开发必练内功_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

软件分享丨Marktext 编辑器

Marktext是一款开源免费的Markdown编辑器&#xff0c;它具有简洁优雅的界面设计和强大的功能&#xff0c;支持多种Markdown语法&#xff0c;包括表格、流程图、甘特图、数学公式、代码高亮等。Marktext还支持导出HTML和PDF格式的文档&#xff0c;非常适合需要编写Markdown文档的…

5G NR:BWP入门

简介 5G NR 系统带宽比4G LTE 大了很多&#xff0c;4G LTE 最大支持带宽为20MHz&#xff0c; 而5G NR 的FR1 最大支持带宽为100MHz&#xff0c; FR2 最大支持带宽为 400MHz。 带宽越大&#xff0c;意味了终端功耗越多。为了减少终端的功耗&#xff0c;5G NR 引入了BWP(Band Wid…

不写单元测试的我,被批了

最近在看单元测试的东西&#xff0c;想跟大家聊聊我的感受。单元测试这块说实在的&#xff0c;我并不太熟悉&#xff0c;我几乎不写单元测试&#xff0c;也不太爱写单元测试。 当我推广消息推送平台austin的时候&#xff0c;有过批评我整个项目没有单元测试&#xff0c;也有过…

《a16z : 2024 年加密货币现状报告》解析

加密社 原文链接&#xff1a;State of Crypto 2024 - a16z crypto译者&#xff1a;AI翻译官&#xff0c;校对&#xff1a;翻译小组 当我们两年前第一次发布年度加密状态报告的时候&#xff0c;情况跟现在很不一样。那时候&#xff0c;加密货币还没成为政策制定者关心的大事。 比…

生信软件39 - GATK最佳实践流程重构,提高17倍分析速度的LUSH流程

1. LUSH流程简介 基因组测序通常用于分子诊断、分期和预后&#xff0c;而大量测序数据在分析时间方面提出了挑战。 对于从FASTQ到VCF的整个流程&#xff0c;LUSH流程在非GVCF和GVCF模式下都大大降低了运行时间&#xff0c;30 X WGS数据耗时不到2 h&#xff0c;从BAM到VCF约需…

使用 ASP.NET Core 8.0 创建最小 API

构建最小 API&#xff0c;以创建具有最小依赖项的 HTTP API。 它们非常适合需要在 ASP.NET Core 中仅包括最少文件、功能和依赖项的微服务和应用。 本教程介绍使用 ASP.NET Core 生成最小 API 的基础知识。 在 ASP.NET Core 中创建 API 的另一种方法是使用控制器。 有关在最小 …

认识CSS语法

CSS&#xff08;网页美容&#xff09; 重点&#xff1a;选择器、盒子模型、浮动、定位、动画&#xff0c;伸缩布局 Css的作用&#xff1a; 美化网页&#xff1a;CSS控制标签的样式 网页布局&#xff1a;CSS控制标签的位置 概念&#xff1a;层叠样式表&#xff08;级联样式表…

Maven(解决思路)

1.前言 作为一名一线的开发人员&#xff0c;maven大概率是我们用的最多的依赖管理&#xff0c;但是你知道我们的maven出现问题后怎么去排查么&#xff1f;不对&#xff0c;确切的来说&#xff0c;假如你去导入的包没有被成功导入&#xff0c;你有什么方法去排查、去解决这个问题…

Linux-Centos操作系统备份及还原(整机镜像制作与还原)--再生龙

适用场景 Linux系统设备需要备份整机数据&#xff0c;或者需要还原到多台设备上。适用再生龙工具进行整机备用和还原。 镜像制作 下载再生龙镜像&#xff1a;clonezilla-live-2.6.4-10-amd64.iso&#xff0c;制作启动盘-设置U盘启动 启动后界面如下选择第四项other modes of…

力扣143:重排链表

给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示…