谈到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 (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中的运维数据表及它们之间的关系如下图:
需要注意的是,JobRepository只负责领域对象的CRUD操作,但是并不负责上面说的数据库表的创建,因此,在启动Job前必须自己创建好这些表,SpringBatch中提供了创建这些数据库表的SQL脚本,可以通过schema-(数据库).sql,找到这些脚本,简单修改一下就可以用了。
SimpleJob.execute(JobExecution execution); AbstractStep.execute(StepExecution stepExecution); (Object->AbstractStep->ItemOrientedStep & TaskletStep) TaskletStep.doExecute(StepExecution stepExecution); Tasklet.execute()
相关推荐
- **领域模型**:Spring Batch定义了一系列核心领域概念,如Job(作业)、Step(步骤)、Chunk(块)、Reader(读取器)、Processor(处理器)和Writer(写入器),这些概念构成了处理数据流的基本单元。 - **应用...
书中详细介绍了Spring Batch的核心概念,包括: - **Job**:代表一个完整的批处理作业,它可以包含多个步骤(Step)。 - **Step**:是Job中的一个阶段,通常负责读取输入数据、处理数据以及写入输出数据。 - **...
《Pro Spring Batch》一书深入探讨了Java Spring Batch框架的核心概念与实际应用,为开发者提供了全面的批处理技术指南。本书由Apress出版,旨在帮助读者掌握Spring Batch框架的精髓,提升在批量数据处理领域的技能...
#### 三、Spring Batch的领域语言 **3.1 Job** Job 是Spring Batch 中的核心概念之一,它代表了一个完整的批处理作业。一个Job可以包含一个或多个Step。 - **3.1.1 Job Instance** Job Instance 表示Job的一个...
本书详细介绍了Spring Batch的核心概念和实践应用,帮助开发者理解和掌握如何在Java项目中有效地使用它。主要知识点包括: 1. **Spring Batch简介**:介绍Spring Batch的背景、目标和在企业级应用中的价值,以及其...
Spring Batch 引入了一系列的领域概念,用于描述批处理任务的各种实体和交互。 ##### Job 立体类型 - **Job**:一个 Job 表示一个完整的批处理任务,它可以包含一个或多个 Step。 - **JobInstance**:表示 Job 的...
1. **Job和Step**:Job是Spring-Batch中的一个高级概念,代表了一个批处理任务,由一个或多个Step组成。Step是执行实际任务的最小单位,通常包含一个ItemReader、ItemProcessor和ItemWriter。 2. **DataSource**:...
#### 三、Spring Batch 的领域语言 Spring Batch 定义了一套专门的语言来描述批量处理任务,主要包括以下几个概念: - **Job**:表示一个批处理任务,由一个或多个 Steps 组成。 - **Job Instance**:代表一个 Job...
Commit Interval是Spring Batch中的一个重要概念,它定义了每批数据提交到数据库的频率。 **5.1.5 Configuring a Step for Restart** 为了保证Step的可重启性,需要正确配置相关的组件,如使用幂等性的...
1. **Job**: Job是Spring Batch中的顶级概念,代表一个完整的批处理任务,可以包含多个步骤(Steps)。 2. **Step**: Step是Job的组成部分,负责执行特定的任务,如读取数据、处理数据、写入数据等。 3. **Item ...
这个压缩包"Batch批处理框架.zip"包含了深入学习Spring Batch的相关资源,适合初学者到高级开发者,旨在帮助你成为批处理领域的专家。 Spring Batch 提供了一套标准的API和实现,用于处理批量数据处理任务,包括...
在Java开发领域,Spring Batch是一个广泛使用的批量处理框架,它提供了一套强大而灵活的工具,用于处理大量的数据处理任务。"流体弹簧分批"(fluid-spring-batch)项目显然是针对Spring Batch的一种优化或者封装,...
通过上述知识点的学习,我们不仅可以了解到Spring框架的基本概念和核心功能,还能够掌握如何使用Spring来构建高效、可维护的企业级应用。Spring作为Java领域的重要框架之一,在实际项目开发中有着广泛的应用,掌握其...
在IT领域,Spring Batch 是一个强大且灵活的批处理框架,主要用于处理大量数据的批量处理任务。本指南将深入探讨Spring Batch 的核心概念、功能以及如何在Java环境中集成与应用。 一、Spring Batch 框架概述 Spring...
在深入探讨Spring Batch之前,我们先了解下Java在批处理领域的地位。 Java作为一种通用编程语言,因其丰富的库和强大的并发处理能力,成为开发批处理应用的理想选择。Spring框架进一步提升了Java开发的效率,提供了...
Spring Batch作为Java批处理领域的强大工具,提供了丰富的功能和高度的灵活性。理解其核心概念和组件,以及如何在实际项目中应用,对于提升批量处理任务的效率和质量至关重要。通过合理的配置和设计,Spring Batch...
Spring作为Java领域最流行的轻量级应用框架之一,它以其强大的功能、易用性和灵活性备受开发者喜爱。本教学系列深入浅出地介绍了Spring的核心概念、主要特性以及实际开发中的应用,旨在帮助学习者快速掌握并精通...
首先,让我们了解Spring Batch的基本概念。Spring Batch 提供了一套完整的抽象层,包括Step、Job、ItemReader、ItemProcessor和ItemWriter,它们是构建批处理任务的核心组件。Step 是批处理过程中的最小执行单元,由...
通过深入研究"spring-batch-exemplo",你将能够掌握Spring Batch的核心概念,并能将其应用到自己的项目中,从而有效地处理大规模数据处理任务。同时,你还可以了解到如何将Spring Batch与其他Spring框架集成,如...