谈到Spring Batch,会谈到很多的领域概念,Job, Step,JobLauncher,JobRepository,JobExecution,Chunk,Tasklet等等,这些概念一窝蜂的涌过来,让开发者非常容易迷失其中,本文的目的就是理顺一下这些领域概念,把所有这些概念逻辑的联系起来。
首先,看一下Spring Batch官方文档中Spring Batch的架构图:
这个架构图非常简单,传递了SpringBatch中最重要的几个领域概念:
- JobLauncher: 顾名思义,该领域对象就是Job的启动器,其作用就是绑定一组JobParameters到Job上,然后运行该Job。
- Job: 定义,配置批处理任务的领域对象,该对象的作用,第一是做Step的容器,配置该批处理任务需要的Step,以及他们之间的逻辑关系。第二是配置该批处理任务的特征,比方说名字,是否可重启,是否对JobParameters进行验证以及验证规则等。
- Step: 定义批处理任务中一个对立的逻辑任务处理单元。基本上的业务逻辑处理代码都是封装在Step中的。Step有2种实现形式,一种是Tasklet形式的,这种形式非常自由,开发人员只需要实现Tasklet接口,其中的逻辑完全有自己决定,另一种是Chunk-Oriented形式的,这种形式定义了一个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中的运维数据表及它们之间的关系如下图:
需要注意的是,JobRepository只负责领域对象的CRUD操作,但是并不负责上面说的数据库表的创建,因此,在启动Job前必须自己创建好这些表,SpringBatch中提供了创建这些数据库表的SQL脚本,可以通过schema-(数据库).sql,找到这些脚本,简单修改一下就可以用了。
- 大小: 191.7 KB
分享到:
相关推荐
Spring Batch API(Spring Batch 开发文档).CHM。 官网 Spring Batch API,Spring Batch 开发文档
Spring Boot整合Spring Batch的一个小例子,在网上发现这方面的资源比较少,特此将其上传供大家学习。
spring batch批处理框架和对应的源码资源 rar 可以直接运行的
Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使得已经使用 Spring 框架的开发者或者企业更容易访问和利用企业服务。 Spring Batch 提供了大量可重用的组件,包括了日志、追踪、事务、...
基于Spring Batch的大数据量并行处理 基于Spring Batch的大数据量并行处理
Spring Batch是一个轻量级的,完全面向Spring的批处理框架,可以应用于企业级大量的数据处理系统。Spring Batch以POJO和大家熟知的Spring框架为基础,使开发者更容易的访问和利用企业级服务。Spring Batch可以提供...
最近在研究springBoot+springbatch ,按照官网的实例做了一个实例。 最近在研究springBoot+springbatch ,按照官网的实例做了一个实例。
Work with all aspects of batch processing in a modern Java environment using a selection of Spring frameworks. This book provides up-to-date examples using the latest configuration techniques based on...
难得的详细spring batch资料 难得的详细spring batch资料
基本篇重点讲述了数据批处理的核心概念、典型的作业配置、作业步配置,以及Spring Batch框架中经典的三步走策略:数据读、数据处理和数据写,详尽地介绍了如何对CVS格式文件、JSON格式文件、XML文件、数据库和JMS...
主要给大家介绍了Spring Batch读取txt文件并写入数据库的方法,SpringBatch 是一个轻量级、全面的批处理框架。这里我们用它来实现文件的读取并将读取的结果作处理,处理之后再写入数据库中的功能。需要的朋友可以...
SpringBatch数据库建表语句,存储springBatch批处理过程中需要保存的数据和步骤信息
Spring Batch批处理框架Spring Batch批处理框架Spring Batch批处理框架
springbatch mybatis
Spring Batch 实例代码
spring-batch4.0.0 batch spring-batch集成 spring-batch.jar
Spring batch in action,很好的一本书。
Spring Batch In Action
Spring Batch in Action is a comprehensive, in-depth guide to writing batch applications using Spring Batch. Written for developers who have basic knowledge of Java and the Spring lightweight ...
Spring Batch in Action