SpringBatch的领域概念

谈到Spring Batch,会谈到很多的领域概念,Job, Step,JobLauncher,JobRepository,JobExecution,Chunk,Tasklet等等,这些概念一窝蜂的涌过来,让开发者非常容易迷失其中,本文的目的就是理顺一下这些领域概念,把所有这些概念逻辑的联系起来。 

首先,看一下Spring Batch官方文档中Spring Batch的架构图: 
SpringBatch的领域概念_第1张图片

这个架构图非常简单,传递了SpringBatch中最重要的几个领域概念: 

  • JobLauncher: 顾名思义,该领域对象就是Job的启动器,其作用就是绑定一组JobParameters到Job上,然后运行该Job。
  • Job: 定义,配置批处理任务的领域对象,该对象的作用,第一是做Step的容器,配置该批处理任务需要的Step,以及他们之间的逻辑关系。第二是配置该批处理任务的特征,比方说名字,是否可重启,是否对JobParameters进行验证以及验证规则等。
  • Step: 定义批处理任务中一个对立的逻辑任务处理单元。基本上的业务逻辑处理代码都是封装在Step中的。Step有2种实现形式,一种是Tasklet (TaskletStep) 形式的,这种形式非常自由,开发人员只需要实现Tasklet接口,其中的逻辑完全有自己决定,另一种是Chunk-Oriented (ItemOrientedStep)形式的,这种形式定义了一个Step的流程必须是“读-处理(可选)-写”,当然Spring Batch也对每一个步骤提供了接口ItemReader, ItemProcessor,ItemWriter还有很多常用的默认实现(读文件,读数据库,写文件,写数据库等等)。 每一个Step只能由一个Tasklet或者一个Chunk构成。
  • JobRepository: 该领域对象会为Spring Batch的运维数据提供一种持久化机制。其为所有的运维数据的提供CRUD的操作接口,并为所有的操作提供事务支持。



上面这些,都是我们在定义一个Batch Job时会直接涉及到的领域概念,但是,其实JobRepository持久化的并不是Job,Step对象本身,在Batch Job运行时,Job,Step都会创建出自己的一些领域对象以保障Batch Job的运行,支持重启动,跳过等等特性。 这就涉及到更多其他的领域概念: 

  • JobInstance:该领域概念和Job的关系与Java中实例和类的关系一样,Job定义了一个工作流程, JobInstance就是该工作流程的一个具体实例。一个Job可以有多个JobInstance, 多个JobInstance之间的区分就要靠另外一个领域概念JobParameters了。
  • JobParameters:是一组可以贯穿整个Job的运行时配置参数。不同的配置将产生不同的JobInstance,如果你是使用相同的JobParameters运行同一个Job, 那么这次运行会重用上一次创建的JobInstance。另外,Spring Batch还非常贴心的提供了让JobParameters中的部分参数不参与JobInstance区分的功能。
  • JobExecution: 该领域概念表示JobInstance的一次运行,JobInstance运行时可能会成功或者失败。每一次JobInstance的运行都会产生一个JobExecution。同一个JobInstance(JobParameters相同)可以多次运行,这样该JobInstance将对应多个Jobexecution。JobExecution记录了一个JobInstance在一次运行时的发生的所有事情,因此,一个JobExecution需要包含很多的属性,并且需要持久化,这样才能很好的支撑Restart等Spring Batch特性。其包含的属性有:
  • StepExecution: 类似于JobExecution,该领域对象表示Step的一次运行。Step是Job的一部分,因此一个StepExecution会关联到一个Jobexecution。另外,该对象还会存储很多与该次Ste运行相关的所有数据,因此该对象也有很多的属性,并且需要持久化以支持一些Spring Batch的特性。这些特性包括:
  • ExecutionContext: 从前面的JobExecution,StepExecution的属性介绍中已经提到了该领域概念。说穿了,该领域概念就是一个容器,该容器由Batch框架控制,框架会对该容器持久化,开发人员可以使用该容器保存一些数据,以支持在整个BatchJob或者整个Step中共享这些数据

。 

经过上面的所有介绍,可以通过一个简单的Spring Batch工作过程来更清晰了解各个领域概念在整个Batch Job中的位置和作用。 

首先,开发者定义Batch Job, 定义的过程,需要清楚的配置Job,Step。 

然后,配置JobLauncher,即指定该Job的基本运行方式,一个JobLaucher需要指定JobRepository(如何持久化Batch框架的领域对象),Executor(使用单线程的还是多线程的,同步的还是异步的Executor)。 

接着,使用JobLaucher启动Job,启动Job的时候,同时会附上本次Job运行的参数JobParameters。Job启动时,会首先去查找是否已存在相同JobParameters的JobInstance,没有就创建一个新的JobInstance,有的话就重用该JobInstance,确认JobInstance之后,会为该JobInstance创建一个JobExecution,该JobExecution会顺带创建一个JobExecutionContext用于在Job执行过程中保存一些数据。然后,把创建的JobExecution对象附着在Job的运行过程中。该步骤中涉及的领域对象JobParameters,JobInstance,JobExecution,JobExecutionContext都会通过JobRepository提供的DAO持久化。 

最后,运行Job,该过程就是按照Job定义的Step顺序一步一步的执行的Step,每执行一个Step,就会创建一个StepExecution,同样的StepExecution会顺带创建一个StepExecutionContext保存Step执行过程中的一些数据。该步骤涉及的StepExecution,StepExecutionContext也会通过JobRepository提供的DAO持久化。 

这就是一个简单的Batch Job的整个运行过程。 
接下来看一下,Spring Batch中的运维数据表,前面提到很多的领域对象都需要持久化,代表的持久化方式就是存储到数据库表中。了解这些持久化的领域对象,对于开发者了解Job在运行过程出现的问题,会有很大帮助,同时还能强化大家对各个领域概念之间关系的理解。Spring Batch中的运维数据表及它们之间的关系如下图: 

SpringBatch的领域概念_第2张图片

需要注意的是,JobRepository只负责领域对象的CRUD操作,但是并不负责上面说的数据库表的创建,因此,在启动Job前必须自己创建好这些表,SpringBatch中提供了创建这些数据库表的SQL脚本,可以通过schema-(数据库).sql,找到这些脚本,简单修改一下就可以用了。

 

 

SpringBatch的领域概念_第3张图片

 

 

SpringBatch的领域概念_第4张图片

 

 

 

SimpleJob.execute(JobExecution execution);
    AbstractStep.execute(StepExecution stepExecution); (Object->AbstractStep->ItemOrientedStep & TaskletStep)
    TaskletStep.doExecute(StepExecution stepExecution);
        Tasklet.execute()

 

你可能感兴趣的:(spring)