关于数据异步导出

上周开始做大量数据导出需求,今天记录些思路。

分析

  1. 原系统使用同步导出,文件流形式响应前端。
  2. 前端页面一直卡住无提示体验不佳,且数据量有限制以避免请求超时。
  3. POI导出工具类使用XSSFworkbook,如果数据量巨大可能会内存溢出。

基于现状需要改造系统导出,采用异步导出。
异步导出可以做成统一界面、前端轮询或是邮件通知的形式。
异步导出文件对象,采用上传云存储返回用户URL的形式下载。

思路

asychronous _export.png
不开发界面查询导出任务,用户提交导出请求后,以同参数轮询接口。
应用系统兼顾后台系统导出系统

聊一聊数据导出那些事 这篇文章中聊到的导出过程相当有范

  1. 提交导出申请:接口实现
  2. 生成导出批次:参数实现
  3. 发送导出批次到中间件
  4. 提交申请成功
  5. 读取导出批次信息:异步线程池传参
  6. 查询/生成/加密文件
  7. 上传到云存储
  8. 组装下载地址
  9. 回填信息:前端轮询
  10. 查询导出申请并下载:前端轮询

总体看来思路相同,包括第六步对旧文件的处理
主要区别来自需求和架构,在用户交互和第五步对导出任务执行上的区别

实现

  1. 改造工具类使用SXSSFWorkbook导出excel
  2. 设计导出任务数据结构
  3. 同进程异步线程池执行导出任务;更新进度
  4. 管道流在异步线程池中上传文件对象;更新进度
  5. 列举云存储文件,删除旧导出文件
  6. 返回轮询目标任务文件URL,导出完成

聊一聊数据导出那些事
使用SXSSFWorkbook来导出excel
HSSFworkbook,XSSFworkbook,SXSSFworkbook区别总结
Java中怎么将OutputStream 转换成InputStream
对象存储 OSS