您的位置:首页 > 数据库 > Redis

[置顶] 【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(一)

2018-02-08 10:34 1056 查看
【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(一)

【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(二)

【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(三)

【码云地址】:https://gitee.com/ydc_coding

前言:

这是一款将Excel表格中的数据导入至数据库中的小工具,为什么会突然想做这个呢?

这是源于两次抱怨,第一次抱怨是发生在公司开发的人事系统正式在审计局上线前的培训会上,甲方使用人员提出:为什么没有批量导入数据的功能,在这之前,他们已经在使用另外一款其他公司开发的功能类似的系统,需要将那边系统的数据同步至这个新的系统上,如果只能依次手动输入的话,他们工作量反而增大了….

第二次是来自审计局服务办运维同事的抱怨:新上线人事系统中的个人基础数据需要进行更正校验,将之前试运行阶段中添加进去的数据与人事处最新发布的个人信息相匹配,将有变化的数据进行更正或删除新增…这已经是第二次校验了,上一次足足花了2天的时间才完整的手动校验完成…

分析:

依照上诉同事的需求(甲方的需求呢?嗯?甲方的需求?甲方刚刚又提什么需求了???),个人感觉可以往以下几个方面去考虑:

因为需要同步的数据是变化的,全国这么多服务办,每个地区数据库里的字段又不太相同,所以不能实体类的字段名称“写死”,并且在对应mapper中用注解的形式绑定sql语句,方便后期运维同事自行维护。

从过程上来分析,我们需要对传入的数据进行至少两层操作,例如首先对传入的数据进行格式校验,再将数
d144
据插入数据库后返回的结果进行判断是否操作成功。

从结果上来分析,我们希望能不仅仅只把成功或失败的“个数”反馈给我们,还希望能把对应的数据以Excel的形式再回传给我们,方便我们的运维同事在此基础上进行二次编辑调整。

因考虑到需要同步的数据较大,如果使用直接请求访问的方式,可能请求响应的时间就太长了,所以可以使用消息队列来进行异步处理,以此来减少请求响应时间和解耦。

技术选择:

综合以上考虑:

前端选择用:Thymeleaf、JQuery、Layui、Layer搭建基础操作模块,用echarts构建返回的数据同步结果信息;

后端选择用:SpringBoot、Mybatis快速搭建项目;

消息中间件选择用:Redis(缓存、发布订阅模式)、Druid(连接池);

其他依赖Jar包:EasyPoi、FastJson、Lombok….

这里为什么选择用Redis呢?

- 首先可以作为缓存,将导入过程中产生的各种数据进行暂时存储。

- 再者因为甲方这边的服务器上已经搭建了另外一款已过保的商用消息中间件-TongLINK/Q(类似于IBM MQ),不太方便对其进行操作,所以选择用Redis自带的发布订阅模式以此来实现消息队列的效果。

业务介绍:



说明:默认首页,UI模板使用的是layui的后台布局-Layui



说明:点击后,选中需要上传的Excel文件



说明:上传后,首先会出现加载层,防止用户多次重复上传



说明:返回数据格式校验后的结果,这是第一层操作,此时后台已经把通过第一层数据校验后的数据发布至消息队列中,消费者此时正在异步的处理数据。这一块的请求响应时间是比较短的,因为这里我们并没有直接对数据库进行操作,只是把数据发布至对应的频道中。



说明:这里是防止用户在前一步时手误选择”不需要”后的一次冗余的补救措施。











说明:在上一步选择“需要”后,就可以实时的查看当前消息队列中未被消费的数据,直至所有的数据都被消费后,弹出询问框。点击“立即查看”后,会直接以弹出层的形式,全屏展示数据同步结果;点击“稍等”,则会在一定时间后再次进行询问。









说明:

1.左下角的饼状图:对第一层操作(数据格式校验)的结果进行统计;

2.右下角的饼状图:对第二层操作(数据导入数据库)的结果进行统计;

3.中间大的饼状图:对总体同步数据库的结果进行统计;

4.点击左下角或右下角的饼状图,可以下载对应操作未通过的数据;



说明:点击下载Excel模板



说明:点击后,打开新窗口跳转至Druid连接池监控页面







说明:对上传Excel文件过程中,可能存在的异常信息进行了封装反馈给用户。

总结

总体的业务逻辑与其对应实现的技术都比较简单,但前前后后也用了接近一周的时间去完成

一是每天能留给自己去写东西的时间不多,再者确实是因为长时间使用公司内部封装的框架,导致对以前玩过的一些框架有一些生疏,开发起来不怎么顺手。当然,正好利用这次机会,去重新复习稳固一下那些遗忘的框架知识点

总的来说,受益匪浅啊~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: