只能靠写博客来鞭策自己学习了

  • Spring Batch 的核心api
  • Job
  • JobInstance
  • JobParameters
  • Step
  • StepExecution
  • ExecutionContext
  • JobRepository
  • JobLauncher
  • Item Reader
  • Item Processor
  • Item Writer
  • Chunk



系列文章第二篇,学习一下 spring batch 的核心 api ,第一篇文章的传送门:

Spring batch系列文章(一)——介绍和入门

Spring Batch 的核心api

参考链接:批处理框架spring batch基础知识介绍 首先放一张 Spring Batch 的架构图:

springbatch API springbatch api文档_批处理


spring batch 最基本的组件就是 Job 和 Step,一个 Job 可以定义很多的 Step,每个 Step 又可以有自己的 Reader、Writer、Processor 分别进行读数据、写数据、处理数据。每个 Job 都在 JobRepository 里面,通过 JobLauncher 可以启动一个 Job。

Job

Job 是封装整个批处理过程的一个概念。是一个顶层接口,实现类主要有两种类型的 Job,一个是 simplejob,另一个是 flowjob,一个 Job 可以理解为一个完整的批处理任务。
Job 是运行批处理的基本单位,内部由 Step 组成,所以 Job 也可以看成是 Step 的容器,一个 Job 可以按照指定的逻辑进行组合 Step,决定每个 Step 的执行顺序,并提供了给所有 Step 设置相同属性的方法,如事件监听、跳过策略。
Spring Batch 以 SimpleJob 类的形式提供了 Job 接口的默认简单实现,它在 Job 之上创建了一些标准功能。一个使用 java config 的例子代码如下:

@Bean
public Job footballJob() {
    return this.jobBuilderFactory.get("footballJob")
                     .start(playerLoad())
                     .next(gameLoad())
                     .next(playerSummarization())
                     .end()
                     .build();
}

这个配置的意思是:首先给这个 job 起了一个名字叫 footballJob,接着指定了这个 job 的三个 step,他们分别由方法,playerLoad,gameLoad, playerSummarization 实现。

JobInstance

具体可以用来指一个 Job 的实例,每个 Job 都有对应的 JobInstance,或者说都会有至少一个 JobInstance 来记录 job 的运行情况。
JobExecution
代表 Job 的一次执行,Job 每执行一次,都会生成此次 Job 执行所生成的 JobExecution。每个 JobExecution 记录了这个 Job 此次执行的时间和状态(成功、失败)。

JobParameters

用来标识 JobInstance 的区别,JobParameter 包含一组用来启动批处理的参数。
如果定义了一个 Job,每天执行一次,9 月 14 日执行一次,会产生一个 JobInstance,9 月 15 日又执行一次,又产生一个 JobInstance,这个 Job 就具有了两个实例,我们可以定义两个 JobParameter,一个是 9 月 14 日,一个是 9 月 15 日,这样就区分了两个不同的 JobInstance,所以可以理解为 JobInstance = Job + JobParameter。

Step

理解 step 的图例:

springbatch API springbatch api文档_数据_02

Step 封装了批处理作业的一个独立的阶段,每一个 Job 都由一个阶段或多个阶段构成。 每一个 step 包含定义和控制实际批处理所需的所有信息。 任何特定的内容都由编写 Job 的开发人员自行决定。 一个 step 可以非常简单也可以非常复杂。 例如,一个 step 的功能是将文件中的数据加载到数据库中,那么基于现在 spring batch 的支持则几乎不需要写代码。 更复杂的 step 可能具有复杂的业务逻辑,这些逻辑作为处理的一部分。 与 Job 一样,Step 具有与 JobExecution 类似的 StepExecution。

StepExecution

StepExecution表示一次执行Step, 每次运行一个Step时都会创建一个新的StepExecution,类似于JobExecution。 但是,某个步骤可能由于其之前的步骤失败而无法执行。 且仅当Step实际启动时才会创建StepExecution。
一次step执行的实例由StepExecution类的对象表示。 每个StepExecution都包含对其相应步骤的引用以及JobExecution和事务相关的数据,例如提交和回滚计数以及开始和结束时间。 此外,每个步骤执行都包含一个ExecutionContext,其中包含开发人员需要在批处理运行中保留的任何数据,例如重新启动所需的统计信息或状态信息。

ExecutionContext

ExecutionContext即每一个StepExecution 的执行环境。它包含一系列的键值对。

JobRepository

JobRepository是一个用于将上述job,step等概念进行持久化的一个类。 它同时给Job和Step以及下文会提到的JobLauncher实现提供CRUD操作。 首次启动Job时,将从repository中获取JobExecution,并且在执行批处理的过程中,StepExecution和JobExecution将被存储到repository当中。
@EnableBatchProcessing注解可以为JobRepository提供自动配置。

JobLauncher

JobLauncher这个接口的功能非常简单,它是用于启动指定了JobParameters的Job,为什么这里要强调指定了JobParameter,原因其实我们在前面已经提到了,jobparameter和job一起才能组成一次job的执行。

Item Reader

ItemReader是一个读数据的抽象,它的功能是为每一个Step提供数据输入。 当ItemReader以及读完所有数据时,它会返回null来告诉后续操作数据已经读完。Spring Batch为ItemReader提供了非常多的有用的实现类,比如JdbcPagingItemReader,JdbcCursorItemReader等等。
ItemReader支持的读入的数据源也是非常丰富的,包括各种类型的数据库,文件,数据流,等等。几乎涵盖了我们的所有场景。

Item Processor

ItemProcessor对项目的业务逻辑处理的一个抽象, 当ItemReader读取到一条记录之后,ItemWriter还未写入这条记录之前,I我们可以借助temProcessor提供一个处理业务逻辑的功能,并对数据进行相应操作。如果我们在ItemProcessor发现一条数据不应该被写入,可以通过返回null来表示。ItemProcessor和ItemReader以及ItemWriter可以非常好的结合在一起工作,他们之间的数据传输也非常方便。我们直接使用即可。

Item Writer

既然ItemReader是读数据的一个抽象,那么ItemWriter自然就是一个写数据的抽象,它是为每一个step提供数据写出的功能。写的单位是可以配置的,我们可以一次写一条数据,也可以一次写一个chunk的数据,关于chunk下文会有专门的介绍。ItemWriter对于读入的数据是不能做任何操作的。

Spring Batch为ItemWriter也提供了非常多的有用的实现类,当然我们也可以去实现自己的writer功能。

下图是Step里三个步骤的流程示意图:

springbatch API springbatch api文档_java_03

Chunk

springbatch API springbatch api文档_java_04

它的意思就和图示的一样,由于我们一次batch的任务可能会有很多的数据读写操作,因此一条一条的处理并向数据库提交的话效率不会很高,因此spring batch提供了chunk这个概念,我们可以设定一个chunk size,spring batch 将一条一条处理数据,但不提交到数据库,只有当处理的数据数量达到chunk size设定的值得时候,才一起去commit。