点击空白处退出提示
TMS系统-dataio服务
我要开发同款作品详情
使用技术:SpringBoot+Swagger2+poi+jedis+Maven
项目描述: 由于项目中基本每个模块都有导入、导出功能,旨在统一封装导入导出重复操作,为客户端提供统一入口
责任描述:
a) 导入导出通用方案的业务抽象、设计
b) 导入导出的技术方案选型
c) 导入导出核心功能实现与优化
技术描述:
a) 业务设计
统一抽象功能,只包含导入、导出两个入口,把解析excel、封装对象、组装excel等与具体业务无关的操作抽离,根据各模块的具体模板来进行数据的抽取和封装,然后调用具体业务的接口进行数据落地操作
由于导入导出数据量较大、耗时较长,提供导入、导出历史,将具体操作结果整理至excel,可供用户下载查看
b) 技术方案与实现
使用Apache的poi工具进行excel的解析与导出,dataio服务根据模板做简单的数据格式方面的校验,若校验通过则通过feign调用具体业务进行数据深度校验、逻辑计算与入库,有任一环节失败则统一返回错误对象,dataio进行操作结果的excel组装,整个过程在后台用过线程池进行调度,用户点击按钮后即可进行其他操作
导出根据用户操作组装参数分页请求具体业务系统列表接口,解析翻页结果导出excel,然后上传OSS,同步至导出历史
c) 持续优化
问题1:有时转换excel耗时特别长,偶尔出现内存溢出
解决方案:通过新版的SXSSFWorkbook来解决,可通过其构造函数执指定在内存中缓存的行数,剩余的会自动缓存在硬盘的临时目录上,同时,并不会存在页面卡顿的情况
问题2:同一租户下多用户同时进行导入操作时会出现数据重复等脏数据
解决方案:该问题主要因为并发时线程安全以及数据库事务的隔离级别造成的脏数据,使操作变成同步即可。借助于队列先进先出的特性,将导入任务储存至redis的队列之中,dataio服务去从队列中取出任务执行即可。多租户并行则创建n个队列,使用租户标识hash后模n,存入对应队列中
问题3:需要实现实时查看导入导出进度
解决方案:使用观察者模式,当任务处理的数据条数有变时通知观察者,观察者根据策略将进度信息存入Redis,对外提供WebSocket访问
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态
评论