下图是经典批处理框架的架构图:
每个作业Job有1个或多个作业步Step;每个Step对应一个ItemReader、ItemProcessor、ItemWriter;通过Job Launcher可以启动Job,启动Job时需要从JobRepository获取存在的JobExecution;当前运行的Job及Step的结果和状态会保存在JobRepository中。
下面列出Spring Batch中用到的主要领域对象:
领域对象 | 描述 |
---|---|
Job | 作业。批处理中的核心概念,是Batch操作的基础单元 |
Job Instance | 作业实例。每个作业执行时,都会生成一个实例,实例会被存放到JobRepository中,如果作业失败,下次重新执行该作业的时候,会使用同一个作业实例;对Job和Job Instance的关系,可以想象为Java类定义与Java对象实例的关系 |
Job Parameters | 作业参数。它是一组用来启动批处理任务的参数,在启动Job的时候,可以设置任何需要的作业参数,需要注意作业参数会用来表示作业实例,即不同的Job实例时通过Job参数来区分的。 |
Job Execution | 作业执行器。其负责具体Job的执行,每次运行Job都会启动一个新的Job执行器 |
Job Repository | 作业仓库。其负责存储作业执行过程中的状态数据及结果,为JobLauncher,Job,Step提供标准的CRUD实现 |
Job Launcher | 作业调度器。根据给定的JobParameters执行作业 |
Step | 作业步。Job的一个执行环节,多个或一个Step组装成Job,封装了批处理任务中的一个独立的连续阶段 |
Step Execution | 作业步执行器。负责Step的执行,每次运行Step都会启动一个新的执行器 |
Tasklet | Tasklet。Step中具体执行逻辑的操作,可以重复执行,可以设置具体的同步、异步操作等 |
Execution Context | 执行上下文。是一组框架持久化与控制的key/value对,能够让开发者在Step Execution或Job Execution范畴保存需要持久化的状态 |
Item | 条目。一条数据记录 |
Chunk | Item集合。给定数量Item的集合,可以定义对Chunk的读操作、处理操作、写操作,提交间隔等 |
Item Reader | 条目读。其表示step读取数据,一次读取一条 |
Item Processor | 条目处理。用于表示item的业务处理 |
Item Writer | 条目写。用于表示step输出数据,一次输出一批 |
3.1 Job
批处理作业Job由一组Step组成,同时是作业配置文件的顶层元素。每个作业有自己的名字,可以定义Step执行的顺序,以及定义作业是否可以重启。Job的主要属性:
Job执行的时候会生成一个Job Instance,Job Instance包含执行Job期间产生的数据以及Job执行的状态信息等;Job Instance通过Job Name和Job Parameter来区分;每次Job执行的时候都有一个Job Execution,Job Execution负责具体job的执行。Job,Job Instance 和 Job Execution三者的关系如:
一个Job可能有一到多个Job Instance。
一个Job Instance可能有一到多个Job Execution。
3.1.1 Job Instance
Job Instance是一个运行期的概念,Job每执行一次都会涉及一个Job Instance。
Job Instance来源可能有两种:一种是根据设置的Job Parameters从Job Repository中获取一个;如果根据Job Parameters从Job Repository没有获取Job Instance,则新创建一个新的Job Instance。
3.1.2 Job Parameters
Job通过Job Parameters来区分不同的Job Instance。简单的说Job Name + Job Parameters来唯一确定一个Job Instance。如果Job Name一样,则Job Parameters肯定不一样;但是对于不同的Job来说,允许有相同额Job Parameters。Job Instance,Job Name 和 Job Parameters三个关系如下图:
3.1.3 Job Execution
Job Execution表示Job执行的句柄,根据上面描述可知,一次Job的执行可能成功也可能失败。只有Job Execution执行成功后,对应的Job Instance才会被完成。
3.2 Step
Step表示作业中的一个完整步骤,一个Job可以由一个或多个Step组成。Step包含一个实际运行的批处理任务中的所有必须的信息,Step可以是非常简单的业务实现,比如打印"Hello World"信息,也可以是非常复杂的业务处理,Step的复杂程度通常是由业务决定的。
Step与Job的关系如下图:
一个Job可以拥有一个到多个Step,一个Step可以由一到多个Step Execution(当一个Step执行失败,下次重新执行任务的时候,会为该Step重新生成一个Step Execution);一个Job Execution可以有一到多个Step Execution(当一个Job由多个Step组成时,每个Step执行都会生成一个新的Step Execution,则一个Job Execution会拥有多个Step Execution)。
3.2.2 Step Execution
Step Execution是Step执行的句柄。一次Step执行可能成功也可能失败。
3.3 Execution Context
Execution Context是Spring Batch框架提供的持久化与控制的key/value对,能够让开发者在Step Execution或Job Execution中保存需要进行持久化的状态。
3.4 Job Repository
Spring Batch框架提供Job Repository来存储Job执行期的元数据(这里的元数据指的是Job Instance,Job Execution,Job Parameters,Step Execution,Execution Context等数据),并提供两种默认实现。一种是存放到内存中;另一种是存放到数据库中。通过将元数据存放在数据库中,可以随时监控批处理Job的执行状态,查看Job执行结果是成功还是失败,使得在Job失败的情况下重新启动Job成为可能。
3.5 Job Launcher
Job Launcher(作业调度器)是Spring Batch框架基础设置层提供的运行Job的能力。通过给定的Job名称和作业参数Job Parameters,可以通过Job Launcher执行Job。通过Job Launcher可以在Java程序中调用批处理任务,也可以在通过命令行或者其他框架中调用批处理任务。Spring Batch框架提供了Job Launcher的简单实现SimpleJobLauncher:
该接口只有一个run方法,两个参数job和jobParameters。批处理应用可以通过Job Launcher和外部系统交互,通常情况下外部系统可以同步也可以异步调用批处理应用。
3.6 ItemReader
ItemReader是Step中对资源的读出来,Spring Batch框架已经提供了多种类型的读实现,包括文本文件,XML文件,数据库,JMS消息等。直接使用Spring Batch框架提供的读组件可以快速地完成批处理应用的开发和搭建。
上面所有的组件均实现ItemReader接口,接口定义参见:
3.7 ItemProcessor
ItemProcessor阶段表示对数据进行处理,开发者可以实现自己的业务操作来对数据进行处理。
业务操作需要实现ItemProcessor接口,接口定义参见:
process
方法中,参数item时ItemReader读取的数据,返回值O是交给ItemWriter写的数据。
3.8 ItemWriter
ItemWriter是Step中对资源的写处理,Spring Batch框架已经提供了多种类型的写实现。
上面的组件均实现了ItemWriter接口:
【参考】
[1] 《Spring Batch批处理框架》