导出问题处理
问题描述
测试出来一个问题,使用地市的角色,导出数据然后超过了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,然后就提示报错了,该说不说这个问题我真的找了好久,因为确实是文件找不到报错的地方。
相关文章:

导出问题处理
问题描述 测试出来一个问题,使用地市的角色,导出数据然后超过了20w的数据,提示报错,我还以为是偶然的问题,然后是发现是普遍的问题,本地环境复现了,然后是,这个功能是三套角色&…...

通过cv库智能切片 把不同的分镜切出来 自媒体抖音快手混剪
用 手机自动化脚本,从自媒体上获取视频,一个商品对应几百个视频,我们把这几百个视频下载下来,进行分镜 视频切片,从自媒体上下载视频,通过cv库用直方图识别每个镜头进行切片。 下载多个图片进行视频的伪原…...

【机器学习】——numpy教程
文章目录 1.numpy简介2.初始化numpy3.ndarry的使用3.1numpy的属性3.2numpy的形状3.3ndarray的类型 4numpy生成数组的方法4.1生成0和1数组4.2从现有的数组生成4.3生成固定范围的数组4.4生成随机数组 5.数组的索引、切片6.数组的形状修改7.数组的类型修改8.数组的去重9.ndarray的…...

多线程——线程的状态
线程状态的意义 线程状态的意义在于描述线程在执行过程中的不同阶段和条件,帮助开发者更好地管理和调度线程资源。 线程的多种状态 线程的状态是一个枚举类型(Thread.State),可以通过线程名.getState()…...
开源数据库 - mysql - 组织结构(与oracle的区别)
组织形式区别 mysql(Schema -> Table -> Column -> Row) Schema(方案): Scheme是关于数据库和表的布局及特性的信息。它可以用来描述数据库中特定的表以及整个数据库和其中表的信息,如表的一些特…...

vue3+vite 部署npm 包
公司需要所以研究了一下怎么部署安装,比较简单 先下载个vue项目 不用安准路由,pinna 啥的,只需要一个最简单的模版 删掉App.vue 中的其它组件 npm create vuelatest 开始写自定义组件 新建一个el-text 组件, name是重点,vue3中…...

华为鸿蒙HarmonyOS应用开发者高级认证视频及题库答案
华为鸿蒙开发者高级认证的学习资料 1、课程内容涵盖HarmonyOS系统介绍、DevEco Studio工具使用、UI设计与开发、Ability设计与开发、分布式特性、原子化服务卡片以及应用发布等。每个实验都与课程相匹配,帮助加深理解并掌握技能 2、学习视频资料 华为HarmonyOS开发…...

【计网】从零开始认识IP协议 --- 认识网络层,认识IP报头结构
从零开始认识IP协议 1 网络层协议1.1 初步认识IP协议1.2 初步理解IP地址 2 IP协议报头3 初步理解网段划分 1 网络层协议 1.1 初步认识IP协议 我们已经熟悉了传输层中的UDP和TCP协议,接下来我们来接触网络层的协议: 网络层在计算机网络中的意义主要体现…...

大一物联网要不要转专业,转不了该怎么办?
有幸在2014年,踩中了物联网的风口,坏消息,牛马的我,一口汤都没喝上。 依稀记得,当时市场部老大,带我去上海参加电子展会,印象最深的,一些物联网云平台,靠着一份精美PPT&a…...
LeetCode题练习与总结:4的幂--342
一、题目描述 给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。 整数 n 是 4 的幂次方需满足:存在整数 x 使得 n 4^x 示例 1: 输入:n 16 输出&am…...
ubuntu GLEW could not be initialized : Unknown error
原因 某些ubuntu版本默认使用wayland协议,glew不支持 解决方法 1、编辑GDM3配置文件 sudo nano /etc/gdm3/custom.conf 2、修改配置文件 去掉#WaylandEnablefalse前的# 3、重启GDM3服务 sudo systemctl restart gdm3 修改后默认使用X11协议。...

51c~目标检测~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12371248 #目标检测x1 又一个发现 都不知道是第几了 是一个高效的目标检测 动态候选较大程度提升检测精度 目标检测是一项基本的计算机视觉任务,用于对给定图像中的目标进行定位和分类。 论文地址:…...
前端工程化面试题
说一下模块化方案 模块化是为了解决代码的复用和组织问题,可以说有了模块化才让前端有了工程的概念,模块化要解决两大问题 代码隔离和依赖管理,从node.js最早发布的commonjs 到浏览器端的 AMD,CMD 规范以及兼容的 UMD 规范,再到现…...

【Visual Studio】下载安装 Visual Studio Community 并配置 C++ 桌面开发环境的图文教程
引言 Visual Studio 是一个面向 .NET 和 C 开发人员的综合性 Windows 版 IDE,可用于构建 Web、云、桌面、移动应用、服务和游戏。 安装步骤 访问 Visual Studio 的官方下载页面: https://visualstudio.microsoft.com/zh-hans/downloads/运行已下载的 V…...

010Editor:十六进制编辑器
介绍 世界上最好的十六进制编辑器和出色的文本编辑器 010 Editor 是用于处理文本和二进制数据的终极工具包。 添加模板 模板库https://www.sweetscape.com/010editor/repository/templates/ 先下载一个ELF 模板 运行模板...
Vscode中Github Copilot无法使用
现象 Copilot侧边栏显示要登录,但是点击"github登录"没有反应与Copilot对话,报错如下: Unexpected token o, "[object Rea"... is not valid JSON解决方案 在网上怎么找都没找到类似的问题,最后发现是Vsco…...

<项目代码>YOLOv8表情识别<目标检测>
YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…...

利用Msfvenom实现对Windows的远程控制
1.实验准备 kali安装 Apache2(如果尚未安装): sudo apt install apache2 启动 Apache2 服务: sudo systemctl start apache2确认 Apache2 的默认网页可以访问: 打开浏览器并访问 http://<你的Kali IP>ÿ…...
Java Iterator和for区别详解和常见问题及解决方式
在 Java 中,Iterator 是一个用于遍历集合元素的接口。它为访问集合中的元素提供了一种标准的方法,不管具体集合的实现如何。本文将详细讲解 Iterator 的使用、其与 for 循环的区别,以及在遍历集合时的删除操作可能带来的问题,并提…...

川渝地区软件工程考研择校分析
C哥专业提供——计软考研院校选择分析专业课备考指南规划 通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...