spring batch元数据
github地址:
https://github.com/a18792721831/studybatch.git
文章列表:
准备
为了更好的理解spring batch元数据,我们使用常见的数据库,将元数据存储到数据库中,然后使用SQL查询出来,就可以 快速的理解spring的元数据了。
我们新建一个spring batch的项目,gradle项目:
然后还是我们还是用hello world的代码进行学习。
我们将代码完全拷贝过来,需要连接数据库。
接着在resource目录下创建application.yaml文件。
在application.yaml中配置数据库以及spring batch
spring:
main:
allow-bean-definition-overriding: true
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.0.228.117:13306/springbatch?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
username: springbatch
password: springbatch
schema: classpath:org/springframework/batch/core/schema-mysql.sql
initialization-mode: never
batch:
initialize-schema: never
job:
enabled: true
names: study3
Job
批处理作业Job由一组Step组成,同时是作业配置的顶层配置。
每个作业有自己的名字、可以定义Step执行的顺序,以及定义作业是否可以重启。
Job执行的时候会生成一个Job Instance,Job Instance 包含执行Job期间产生的数据已经Job执行的状态信息等;Job Instance通过Job Name和Job Parameter来区分;每次Job执行的时候都有一个Job Execution,Job Execution负责具体job的执行。
Job:作业
Job Instance:作业实例
Job Parameter:作业参数
Job Execution:作业执行器
Job Instance
Job Instance(作业实例)是一个运行期的感念,Job每执行一次都会涉及一个Job Instance。
Job Instance来源可能有两种:一种是根据设置的Job Parameters从Job Repository(作业仓库)中获取一个;如果根据Job Parameters从Job Repository没有获取Job Instance,则重新创建一个新的Job Instance。
Job Instance定义
字段说明
我们修改job的名字为job-instance,然后启动一次。
然后在mysql数据库中查询
如果,我们将job的参数去掉,重复执行,version会增加吗?
第一次:
第二次:
并不会增加。
Job Parameters
Job 通过Job Parameters来区分不同的Job Instance。简单说,就是Job Name + Job Parameters来唯一地确定一个Job Instance。如果Job Name一样,则Job Parameters肯定不一样;但是对于不同的Job来说,允许有相同的Job Parameters。
Job Parameters定义
字段说明
查看下Job Parameters表
现在,有一个问题:Job Instance和Job Parameters的关系?
在Job Instance中有这样一个字段:JOB_KEY。
这个key就是替代了Job Parameter。
用一个比较容易理解的方式来说明Job和Job Parameters的关系。
首先从运行入手:
我们在启动一个Job的时候,需要传入Job和JobParameters:
第一步,根据我们传入的Job和JobParameter从数据库中查询执行结果。
我们重点看如何查询。
在查询执行结果的时候,需要查询JobInstance
jobExecutionDao的getJobInstance方法有两个实现
通过查看源码,猜测,JdbcJobInstanceDao是外部的,非切入式的数据库使用的dao
而MapJobInsttanceDao是切入式的数据库使用的dao。(猜测,不一定准确)
所以,我们查看JdbcJobInstanceDao的方法
我们看下如何生成的jobKey
第一步获取JobParameter的map化对象
第二步,将第一步获取的字符串进行MD5编码,如果MD5编码失败了,那么去UTF-8格式的前32位。(16进制)
拿到了jobKey,如何查询JobInstance呢?
我们看下SQL
合并起来,简单修饰下:
所以,Job Instance和Job Parameter的关系,在JobInstance表中存储,jobKey字段间接关联了JobParameter。
Job Parameters类型
Job Parameter只支持字符串,时间,长整型和双精度类型。
Job Execution
我们前面看到了,执行一个Job,会根据Job Name + Job Parameter查询Job Instance。
Job Execution定义
字段说明
在Job Execution中记录了Job Instance执行的情况,执行结果,退出信息等。
然后根据JobInstance查询Job Execution
Job Execution的查询也是非常的简单
这就是SQL
如果Job Instance的最后一次执行成功了,那么抛出异常;如果最后一次执行失败了,那么验证是否有正在运行的,当前Job Instance的任务,或者是,最后一次还未结束。
如果没有找到最后一个Job Execution,那么就验证Job Parameter的类型等是否符合规则。如果验证通过,那么就创建Job Execution
Step
Step表示作业中的一个完整步骤,一个Job可以由一个或者多个Step组成。Step包含一个世纪运行的批处理任务中的所有必须的信息,Step可以是非常简单的业务实现,比如打印字符串;也可以是非常复杂的业务处理。
一个Job可以拥有一到多个Step;一个Step可以有一到多个Step Execution(当一个Step执行失败,下次重新执行该任务的时候,会为该Step重新生成一个Step Execution);一个Job Execution可以有一到多个Step Execution(当一个Job由多个Step组成时,每个Step执行都会生成一个新的Step Execution,则一个Job Execution会拥有多个Step Execution)。
Step中可以配置tasklet,partition,job,flow。
Step Execution
Step Execution是Step执行的句柄,一次Step执行可能成功,也可能失败。
Step Execution定义
字段说明
具体的记录
Execution Context
Execution Context是spring batch框架提供的持久化与控制的key/value对,能够让开发者在Step Execution或Job Execution中保存需要进行持久化的状态。框架会每次commit后记录当前提交记录数以及读取的记录数,这样当Step发生错误时,下次重启Job会根据Execution Context中的数据恢复状态,保证继续从上次 失败的点重新执行。
Job Execution Context
Job Execution Context定义
Step Execution Context
Step Execution Context定义
关系
两类上下文之间的关系:一个Job Execution对应一个Job Execution的上下文;每个Step Execution对应一个Step Execution上下文;同一个Job中的Step Execution共用Job Execution的上下文。因此如果同一个Job的不同Step间需要共享数据时,则可以通过Job Execution的上下文共享数据。
Job Repository
spring batch框架提供Job Repository来存储Job执行期的元数据(这里的元数据是指Job Instance,Job Execution,Job Parameters,Step Execution,Execution Context等数据),并提供两种默认实现。一种是存放在内存中,另一种是将元数据存放在数据库中。将元数据存放在数据库中,可以随时地监控批处理Job的执行状态,查看Job执行结果是成功还是失败,并且在Job失败的情况下重新启动Job.
spring batch框架的Job Repostory支持如下的数据库:DB2,Derby,H2,HSQLDB,Mysql,Oracle,PostgreSQL,SQLServer,Sybase.
Job Repository的属性
Job Repository类型
前面我们说过,Job Repository有两种实现方式,一种是基于数据库的,一种是基于内存的。
使用数据库:
使用内存:
元数据表
spring batch框架进行元数据管理共有九张表,其中有三张表(后缀为SEQ)是用来分配主键的。
er关系:
Job Launcher
Job Launcher(作业调度器)是spring batch框架基础设施层提供的运行job的能力。通过给定的job名称和作业参数Job Parameters,可以通过Job Launcher执行Job。通过Job Launcher可以在Java 程序中调用批处理任务,也可以在通过命令行或者其他框架(xxl-job或者quartz等)。spring batch框架提供了Job Launcher的简单实现SimpleJobLauncher。
ItemReader
ItemReader是Step中对资源的读处理,spring batch框架已经提供了多种类型的读实现,包括对文本文件,xml文件,数据库,jms消息等读的处理。直接使用spring batch框架提供的读组件可以快速地完成批处理应用的开发和搭建。
ItemProcessor
ItemProcessor阶段表示 对读取的数据进行处理,开发者可以实现自己的业务操作对数据进行处理。
process方法中,参数item是ItemReader读取的数据,返回值是交给ItemProcessor交给ItemWriter写的数据,在process方法中可以修改到的数据的值。如果返回值是null,表示忽略这次的数据。
ItemWriter
ItemWriter是Step中对资源的写处理,spring batch框架已经提供了多种类型的写实现,包括对文本文件,xml文件,DB等写的处理。直接使用spring batch框架提供的写组件可以快速地完成用用的开发和搭建。