一次关于Spring Batch的实践

背景

随着机构码用码量越来越多目前为止有4百万,统计异常接口响应时间会变慢,而且统计异常只统计48小时内,count效率实在太低。

最后考虑使用采集的方式,将异常数据采集到另一张异常表,这样子的话count效率会高些。不仅要采集异常表,还要根据月份汇总归档表也就是分表的概念,这样也能减轻单表的压力。

Spring Batch

目前,Spring Batch是批处理框架为数不多的优秀框架,是一个轻量级、完善的批处理框架。提供了大量可重用的组件,包括了日志、追踪、事务、任务统计、任务重启、跳过、重复、资源管理。

Spring Batch是一个批处理应用框架,不是调度框架,需要调度框架来构建完成批处理任务。项目中使用定时器来调度。

业务场景

  • 周期性的提交批处理
  • 把一个任务并行处理
  • 处理时跳过部分记录

Spring batch 4个主要组件

  • JobLauncher :任务启动器,程序的入口

  • Job:一个具体的任务

  • Step:一个具体的执行步骤,一个Job有多个Step

  • JobRepository:存储数据的仓库,在任务执行的时候,需要它来记录任务状态信息,可以看做是一个数据库的接口

Spring Batch基本层级结构

  • 运行的基本单位是一个Job,一个Job就做一件批处理的事情
  • 一个Job包含多个Step,Step就是每个Job要执行的单个步骤
  • Step会有Tasklet,它是一个任务单元,属于可以重复利用的对象(分表、创建新表)
  • Step会有Chunk,需要定一个多大的数据量是一个chunk,chunk里就是不断循环的一个流程(读数据,处理数据,写数据)

一次关于Spring Batch的实践

结合项目来说明如何使用SpringBatch

  • 读取数据库的定时任务表,通过反射,执行相应定时任务

  • 进入SringBatch部分

  • JobLauncher.run(XXXJob1,JobParameters) 开始启动任务了

  • XXX1Job任务有3个Step(1.建立表+月份 2.读取原表写入到 表+月份 3.删除原表已归档数据)

  • XXX2Job任务有3个Step(1.获取采集48小时时间 2.读取原表异常数据 写入异常表)

Tasklet 与 chunk 总结

tasklet更适合一个步骤到另一个步骤场景,chunk实现处理分页读,或我们不想再内存中保留大量数据场景,项目中用于创建分表和获取时间放入上下文的操作用tasklet,像比如读取表1000条写入表这种利用chunk

相关博客

上一篇:【题解】P7949 [✗✓OI R1] 左方之地


下一篇:史上最全的LTspice安装教程