Spring Batch的核心概念
一个Job有很多Step,每一个Step又有ItemReader,ItemProcessor,ItemWriter,Job需要JobLauncher启动,元数据存储于JobRepository。
简单的一句话就足以描述,下面看图:
Job
Job是描述整个批处理的实体,与之关联的有XML配置或者Java Configuration,Job是顶层的概念,如图所示。
Job的结构,包含了名称,同时作为容器,包含了一些Steps的定义,和是否具备可重启的特性。
SpringBatch提供了默认的SimpleJob实现。
可以使用JobBuilder来定义一个Job,十分方便流畅。
@Bean
public Job footballJob() {
return this.jobBuilderFactory.get("footballJob")
.start(playerLoad())
.next(gameLoad())
.next(playerSummarization())
.end()
.build();
}
JobInstance
JobInstance 是Job每次逻辑上执行的一个实体,每次执行形成一个JobInstance,而JobInstance又对应一系列JobExecution。
JobParameters
如何区分JobInstance呢?答案就是JobParameters,每个JobInstance执行的时候,都会有对应的JobParameters。
JobExecution
JobExecution是单次Job执行的技术上的概念,上图中2007/05/05对应的JobInstance,除非JobExecution执行成功,否则这次的JobInstance会认为失败。假设2007/05/05对应的JobInstance第二次执行成功了,虽然又创建了一个JobExecution,但这两个JobExecution对应的仍然是同一个JobInstance,他们具有相同的参数。
假设EndOfDay job 在 01-01 9:00 PM 执行,但是在9:30PM失败了,那么元数据如下所示:
Table 1. BATCH_JOB_INSTANCE
| JOB_INST_ID | JOB_NAME |
|---|---|
| 1 | EndOfDayJob |
Table 2. BATCH_JOB_EXECUTION_PARAMS
| JOB_EXECUTION_ID | TYPE_CD | KEY_NAME | DATE_VAL | IDENTIFYING |
|---|---|---|---|---|
| 1 | DATE | schedule.Date | 2017-01-01 | TRUE |
Table 3. BATCH_JOB_EXECUTION
| JOB_EXEC_ID | JOB_INST_ID | START_TIME | END_TIME | STATUS |
|---|---|---|---|---|
| 1 | 1 | 2017-01-01 21:00 | 2017-01-01 21:30 | FAILED |
Step
每一个Job由一个或多个Step组成。
StepExecution
与JobExecution类似,在Step层面,也有StepExecution。
ExecutionContext
如果像这样写,那么SpringBatch框架会为你持久化这些执行过程中的数据。
executionContext.putLong(getKey(LINES_READ_COUNT), reader.getPosition());
Step和Job都有各自对应的ExecutionContext
ExecutionContext ecStep = stepExecution.getExecutionContext();
ExecutionContext ecJob = jobExecution.getExecutionContext();
//ecStep does not equal ecJob
JobRepository
JobRepository可以简单理解为 Job的DAO层,干的是CURD的活儿。
SpringBatch提供了开箱即用的@EnableBatchProcessing注解,可以直接定义之后便能使用。
JobLauncher
JobLauncher是作业执行的入口接口,它长下面的样子,实现类要提供从JobRepository获取JobExecution,并执行它的实现。
public interface JobLauncher {
public JobExecution run(Job job, JobParameters jobParameters)
throws JobExecutionAlreadyRunningException, JobRestartException,
JobInstanceAlreadyCompleteException, JobParametersInvalidException;
}
SpringBatch提供了默认实现:SimpleJobLauncher,开箱即用。
ItemReader,ItemWriter,ItemProcessor
ItemReader是Step的每次执行中输入的抽象,ItemWriter是Step每次执行中输出的抽象,ItemProcessor是每次Step整个执行业务的抽象,提供AccessPoint。