CompletableFuture是一个非常好用的并发任务处理工具,本篇文章将介绍由此工具实现并发处理任务,并汇总结果批量保存DB,以此带来效率上的提升。
1 背景介绍
我们通常在项目中都会涉及到接收多天的原始数据,然后生成每天的数据报告,保存到DB。如果是循环每天数据顺序的执行生成每天报告保存DB,会有下面的问题:
- 整个流程变成了串行,耗时较长
- 写入DB的操作也是一条一条数据写入,没有批量写入效率高
1 | java复制代码/** |
耗时:743ms
如果是直接把生成报告的任务提交到线程池处理,主线程需要借助countDownLatch并发工具类等待线程池里面的任务执行完毕之后执行insertBatch(reportList)操作,代码实现上稍显复杂,同时还需考虑多个线程保存任务结果到reportList等线程安全问题。
所以针对上面的问题,引入CompletableFuture工具,实现并发处理任务,并汇总结果批量保存DB,以此带来效率上的提升。同时使用更加简单而且也不存在线程安全问题。
2 并发处理+汇总批量保存
1 | java复制代码/** |
线程池配置
1 | java复制代码@Configuration |
主要流程:
- 循环每天数据,提交生成报告任务到线程池,并发执行生成每日报告
- 任务发生异常处理,主要是打印异常信息,标记结果
- CompletableFuture.allOf方法等待所有任务执行完毕
- 获取任务执行结果,进行每日报告汇总为list
- 最后汇总的list批量保存DB
耗时:331ms,比串行处理节省一半的时间。
最后需要注意的点:
- CompletableFuture需要配置自定义线程池使用,可以做到不同业务线的线程池隔离,避免相互影响
- 任务的异常处理打印必要的异常日志便于排查问题
- 每个任务出现异常时,记得中断后续逻辑,避免汇总的数据出现不完整
3 总结
本章主要介绍了CompletableFuture使用的一类场景:实现并发处理任务 && 等待多个并发任务完成,并汇总各个任务返回的结果 && 批量保存。有类似这种业务场景的可以使用CompletableFuture来实现,以此提高运行效率。
本文转载自: 掘金