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

导出问题处理

问题描述

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

相关文章:

导出问题处理

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

通过cv库智能切片 把不同的分镜切出来 自媒体抖音快手混剪

用 手机自动化脚本&#xff0c;从自媒体上获取视频&#xff0c;一个商品对应几百个视频&#xff0c;我们把这几百个视频下载下来&#xff0c;进行分镜 视频切片&#xff0c;从自媒体上下载视频&#xff0c;通过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的…...

多线程——线程的状态

线程状态的意义 ‌线程状态的意义在于描述线程在执行过程中的不同阶段和条件&#xff0c;帮助开发者更好地管理和调度线程资源。 线程的多种状态 线程的状态是一个枚举类型&#xff08;Thread.State&#xff09;&#xff0c;可以通过线程名.getState&#xff08;&#xff09…...

开源数据库 - mysql - 组织结构(与oracle的区别)

组织形式区别 mysql&#xff08;Schema -> Table -> Column -> Row&#xff09; Schema&#xff08;方案&#xff09;&#xff1a; Scheme是关于数据库和表的布局及特性的信息。它可以用来描述数据库中特定的表以及整个数据库和其中表的信息&#xff0c;如表的一些特…...

vue3+vite 部署npm 包

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

华为鸿蒙HarmonyOS应用开发者高级认证视频及题库答案

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

【计网】从零开始认识IP协议 --- 认识网络层,认识IP报头结构

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

大一物联网要不要转专业,转不了该怎么办?

有幸在2014年&#xff0c;踩中了物联网的风口&#xff0c;坏消息&#xff0c;牛马的我&#xff0c;一口汤都没喝上。 依稀记得&#xff0c;当时市场部老大&#xff0c;带我去上海参加电子展会&#xff0c;印象最深的&#xff0c;一些物联网云平台&#xff0c;靠着一份精美PPT&a…...

LeetCode题练习与总结:4的幂--342

一、题目描述 给定一个整数&#xff0c;写一个函数来判断它是否是 4 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 4 的幂次方需满足&#xff1a;存在整数 x 使得 n 4^x 示例 1&#xff1a; 输入&#xff1a;n 16 输出&am…...

ubuntu GLEW could not be initialized : Unknown error

原因 某些ubuntu版本默认使用wayland协议&#xff0c;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 又一个发现 都不知道是第几了 是一个高效的目标检测 动态候选较大程度提升检测精度 目标检测是一项基本的计算机视觉任务&#xff0c;用于对给定图像中的目标进行定位和分类。 论文地址&#xff1a…...

前端工程化面试题

说一下模块化方案 模块化是为了解决代码的复用和组织问题&#xff0c;可以说有了模块化才让前端有了工程的概念&#xff0c;模块化要解决两大问题 代码隔离和依赖管理&#xff0c;从node.js最早发布的commonjs 到浏览器端的 AMD,CMD 规范以及兼容的 UMD 规范&#xff0c;再到现…...

【Visual Studio】下载安装 Visual Studio Community 并配置 C++ 桌面开发环境的图文教程

引言 Visual Studio 是一个面向 .NET 和 C 开发人员的综合性 Windows 版 IDE&#xff0c;可用于构建 Web、云、桌面、移动应用、服务和游戏。 安装步骤 访问 Visual Studio 的官方下载页面&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads/运行已下载的 V…...

010Editor:十六进制编辑器

介绍 世界上最好的十六进制编辑器和出色的文本编辑器 010 Editor 是用于处理文本和二进制数据的终极工具包。 添加模板 模板库https://www.sweetscape.com/010editor/repository/templates/ 先下载一个ELF 模板 运行模板...

Vscode中Github Copilot无法使用

现象 Copilot侧边栏显示要登录&#xff0c;但是点击"github登录"没有反应与Copilot对话&#xff0c;报错如下&#xff1a; Unexpected token o, "[object Rea"... is not valid JSON解决方案 在网上怎么找都没找到类似的问题&#xff0c;最后发现是Vsco…...

<项目代码>YOLOv8表情识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…...

利用Msfvenom实现对Windows的远程控制

1.实验准备 kali安装 Apache2&#xff08;如果尚未安装&#xff09;&#xff1a; sudo apt install apache2 启动 Apache2 服务&#xff1a; sudo systemctl start apache2确认 Apache2 的默认网页可以访问&#xff1a; 打开浏览器并访问 http://<你的Kali IP>&#xff…...

Java Iterator和for区别详解和常见问题及解决方式

在 Java 中&#xff0c;Iterator 是一个用于遍历集合元素的接口。它为访问集合中的元素提供了一种标准的方法&#xff0c;不管具体集合的实现如何。本文将详细讲解 Iterator 的使用、其与 for 循环的区别&#xff0c;以及在遍历集合时的删除操作可能带来的问题&#xff0c;并提…...

川渝地区软件工程考研择校分析

C哥专业提供——计软考研院校选择分析专业课备考指南规划 通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...