Spring Batch 简明教程

Spring Batch - Architecture

以下是 Spring Batch 架构的示意图。如此图所示,此架构包含三个主要组件,即 Application, Batch CoreBatch Infrastructure

architecture

Application − 此组件包含我们使用 Spring Batch 框架编写的全部作业和代码。

Batch Core − 此组件包含控制和启动批处理作业所需的所有 API 类。

Batch Infrastructure − 此组件包含应用程序和批处理核心组件使用的读取器、编写器和服务。

Components of Spring Batch

下图显示了 Spring Batch 的不同组件以及它们如何相互连接。

components

Job

在 Spring Batch 应用程序中,作业是要执行的批处理。它从开始到结束连续运行。此作业进一步细分为步骤(或作业包含步骤)。

我们将在 Spring Batch 中使用 XML 文件或 Java 类配置作业。以下是 Spring Batch 中对作业的 XML 配置。

<job id = "jobid">
   <step id = "step1" next = "step2"/>
   <step id = "step2" next = "step3"/>
   <step id = "step3"/>
</job>

批处理作业是在 <job></job> 标签中配置的。它有一个名为 id 的属性。在这些标签内,我们定义步骤的定义和顺序。

Restartable − 一般来说,当一个作业正在运行,并且我们尝试再次启动它,这被认为是 restart ,并且它将再次启动。为避免此问题,您需要将 restartable 值设置为 false ,如下所示。

<job id = "jobid" restartable = "false" >

</job>

Step

一个 step 是一个作业的独立部分,其中包含定义和执行作业(其部分)所需的信息。

如该图所示,每一步都由一个 ItemReader、ItemProcessor(可选)和一个 ItemWriter 组成。 A job may contain one or more steps

Readers, Writers, and Processors

一个 item reader 从特定来源读取数据到一个 Spring Batch应用程序中,而 item writer 将数据从 Spring Batch 应用程序写入到特定目的地中。

一个 Item processor 是一个包含处理从 Spring Batch 读入数据的处理器代码的类。如果应用程序读取 "n" 记录,那么处理器中的代码将被执行在每个记录上。

当未给定阅读器和编写器时,一个 tasklet 充当 SpringBatch 的处理器。它只处理一个单一任务。例如,如果我们正在编写一个作业,其中有一个简单的步骤,我们从 MySQL 数据库中读取数据并对其进行处理,然后将其写入文件(扁平文件),那么我们的步骤使用 −

  1. 一个 reader ,从 MySQL 数据库读取。

  2. 一个 writer ,写入一个扁平文件。

  3. 一个 custom processor ,按照我们的希望处理数据。

<job id = "helloWorldJob">
   <step id = "step1">
      <tasklet>
         <chunk reader = "mysqlReader" writer = "fileWriter"
            processor = "CustomitemProcessor" ></chunk>
      </tasklet>
   </step>
</ job>

Spring Batch 提供了一个 readerswriters 的长列表。使用这些预定义的类,我们能够为它们定义 Bean。我们将在以后的章节中详细讨论 readerswriters

JobRepository

Spring Batch 中的作业存储库为 JobLauncher、Job 和 Step 实现提供创建、检索、更新和删除 (CRUD) 操作。我们将在一个 XML 文件中定义一个作业存储库,如下所示。

<job-repository id = "jobRepository"/>

除了 id ,还有一些额外的选项(可选)。以下是带有所有选项及其默认值的作业存储库配置。

<job-repository id = "jobRepository"
   data-source = "dataSource"
   transaction-manager = "transactionManager"
   isolation-level-for-create = "SERIALIZABLE"
   table-prefix = "BATCH_"
   max-varchar-length = "1000"/>

In-Memory Repository − 如果您不想在数据库中保留 Spring Batch 的域对象,您可以按照以下所示配置 jobRepository 的内存版本。

<bean id = "jobRepository"
   class = "org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean ">
   <property name = "transactionManager" ref = "transactionManager"/>
</bean>

JobLauncher

JobLauncher 是一个使用 given set of parameters 启动 Spring Batch 作业的接口。 SampleJoblauncher 是实现 JobLauncher 接口的类。以下是 JobLauncher 的配置。

<bean id = "jobLauncher"
   class = "org.springframework.batch.core.launch.support.SimpleJobLauncher">
   <property name = "jobRepository" ref = "jobRepository" />
</bean>

JobInstance

一个 JobInstance 表示一个作业的逻辑运行;它是在我们运行作业时创建的。每个作业实例通过作业的名称和在运行时传递给它的参数进行区分。

如果一个 JobInstance 执行失败,相同的 JobInstance 可以再次执行。因此,每个 JobInstance 可以有多个作业执行。

JobExecution and StepExecution

JobExecution 和 StepExecution 是一个作业/步骤执行的表示。它们包含作业/步骤的运行信息,诸如开始时间(作业/步骤)、结束时间(作业/步骤)。