上周开始做大量数据导出需求,今天记录些思路。
分析
- 原系统使用同步导出,文件流形式响应前端。
- 前端页面一直卡住无提示体验不佳,且数据量有限制以避免请求超时。
- POI导出工具类使用XSSFworkbook,如果数据量巨大可能会内存溢出。
基于现状需要改造系统导出,采用异步导出。
异步导出可以做成统一界面、前端轮询或是邮件通知的形式。
异步导出文件对象,采用上传云存储返回用户URL的形式下载。
思路
不开发界面查询导出任务,用户提交导出请求后,以同参数轮询接口。应用系统
兼顾后台系统
和导出系统
。
聊一聊数据导出那些事 这篇文章中聊到的导出过程相当有范
- 提交导出申请:接口实现
- 生成导出批次:参数实现
- 发送导出批次到中间件
- 提交申请成功
- 读取导出批次信息:异步线程池传参
- 查询/生成/加密文件
- 上传到云存储
- 组装下载地址
- 回填信息:前端轮询
- 查询导出申请并下载:前端轮询
总体看来思路相同,包括第六步对旧文件的处理
主要区别来自需求和架构,在用户交互和第五步对导出任务执行上的区别
实现
- 改造工具类使用SXSSFWorkbook导出excel
- 设计导出任务数据结构
- 同进程异步线程池执行导出任务;更新进度
- 管道流在异步线程池中上传文件对象;更新进度
- 列举云存储文件,删除旧导出文件
- 返回轮询目标任务文件URL,导出完成
聊一聊数据导出那些事
使用SXSSFWorkbook来导出excel
HSSFworkbook,XSSFworkbook,SXSSFworkbook区别总结
Java中怎么将OutputStream 转换成InputStream
对象存储 OSS