Spring Batch的核心概念

1,809 阅读2分钟

Spring Batch的核心概念

一个Job有很多Step,每一个Step又有ItemReader,ItemProcessor,ItemWriter,Job需要JobLauncher启动,元数据存储于JobRepository。

简单的一句话就足以描述,下面看图: Spring Batch Model

Job

Job是描述整个批处理的实体,与之关联的有XML配置或者Java Configuration,Job是顶层的概念,如图所示。

Spring Batch 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。

Spring Batch 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_IDJOB_NAME
1EndOfDayJob

Table 2. BATCH_JOB_EXECUTION_PARAMS

JOB_EXECUTION_IDTYPE_CDKEY_NAMEDATE_VALIDENTIFYING
1DATEschedule.Date2017-01-01TRUE

Table 3. BATCH_JOB_EXECUTION

JOB_EXEC_IDJOB_INST_IDSTART_TIMEEND_TIMESTATUS
112017-01-01 21:002017-01-01 21:30FAILED

Step

每一个Job由一个或多个Step组成。 Spring Batch 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。