Spring Batch批处理简介


Spring Batch是一个用于创建健壮的批处理应用程序的完整框架。您可以创建可重用的函数来处理大量数据或任务,通常称为批量处理。

Spring Batch提供了许多有用的功能,例如:
•日志记录和跟踪
•事务管理
•作业统计
•管理流程; 例如,通过重新启动作业,跳过步骤和资源管理
•管理Web控制台

该框架旨在管理大量数据并使用分区功能实现高性能批处理。本文将介绍一个简单的项目,解释Spring Batch的每个主要组件。

如Spring Batch文档中所述,使用该框架的最常见方案如下:
•定期提交批处理
•并行处理作业的并发批处理
•分阶段,企业消息驱动处理
•大型并行批处理
•手动或故障后的计划重新启动
•依赖步骤的顺序处理(扩展到工作流程驱动的批处理)
•部分处理:跳过记录(例如,回滚时)
•整批事务:对于批量小或现有存储过程的情况/脚本

在企业应用程序中,处理数百万条记录(数据)或从源读取的需求非常普遍。此源可能包含具有多个记录(如CSV或TXT文件)或数据库表的大型文件。在每个记录中,通常应用一些业务逻辑,执行验证或转换,并完成任务,将结果写入另一种输出格式(例如,数据库或文件)。

Spring Batch提供了一个完整的框架来实现这种要求,最大限度地减少人为干预。

您将查看Spring批处理的基本概念:
•一个Job作业封装批处理过程,并且必须包含一个或多个Step步骤。每个步骤可以按顺序运行,并行运行或分区。
•Step步骤是Job作业的序列组成部分。
•JobLauncher负责执行作业的启动执行,JobExecution是一个Job的运行上下文。
•JobRepository是JobExecution的元数据存储库。

下面使用Spring Batch创建一个简单的作业示例,以了解它的工作原理。

首先,创建一个简单的Java项目并包含spring-batch依赖项。为此,使用其初始化程序(https://start.spring.io)创建Spring Boot应用程序。

添加Spring Batch的依赖项。您可以通过在依赖项框内的搜索栏中键入Spring Batch,然后单击Enter来完成此操作。带有单词Batch的绿色框将显示在所选的依赖项部分中。完成此操作后,单击Generate Project按钮。
pom.xml:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-test</artifactId>
<scope>test</scope>
</dependency>

配置嵌入数据源。出于测试目的,请使用HSQL(http://hsqldb.org/):

<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>

现在,您需要将@EnabledBatchProcessing和@Configuration注释添加到应用程序:

@SpringBootApplication
@EnableBatchProcessing
@Configuration
public class SimpleBatchApplication {

接下来,在这个应用入口类中使用JobBuildFactory类和一个任务进程设置第一个作业,使用StepBuilderFactory类:

@Autowired
privateJobBuilderFactoryjobBuilderFactory;

@Autowired
privateStepBuilderFactorystepBuilderFactory;


然后,Job方法将启动它:

@Bean
public Job job(Step ourBatchStep) throws Exception {
returnjobBuilderFactory.get("jobPackPub1")
         .incrementer(new RunIdIncrementer())
         .start(ourBatchStep)
         .build();
}

创建作业后,将新任务(步骤)添加到作业:

@Bean
public Step ourBatchStep() {
returnstepBuilderFactory.get("stepPackPub1")
         .tasklet(new Tasklet() {
publicRepeatStatus execute(StepContribution contribution, 
ChunkContextchunkContext) {
return null;  
}
})
.build();
}

以下代码显示了应用程序类的完整代码:

@EnableBatchProcessing
@SpringBootApplication
@Configuration
public class SimpleBatchApplication {

public static void main(String[] args) {
SpringApplication.run(SimpleBatchApplication.class, args);
   }

@Autowired
privateJobBuilderFactoryjobBuilderFactory;

@Autowired
privateStepBuilderFactorystepBuilderFactory;

@Bean
public Step ourBatchStep() {
returnstepBuilderFactory.get("stepPackPub1")
            .tasklet(new Tasklet() {
publicRepeatStatus execute
                (StepContribution contribution, 
ChunkContextchunkContext) {
return null;
               }
            })
            .build();
   }

@Bean
public Job job(Step ourBatchStep) throws Exception {
returnjobBuilderFactory.get(
"jobPackPub1")
            .incrementer(new RunIdIncrementer())
            .start(ourBatchStep)
            .build();
   }
}

为了检查一切正常,请运行该应用程序。为此,请在命令行上执行以下命令:
mvnspring-boot:run

或者,您可以通过运行Maven来构建应用程序:
mvn install

运行这个构建的jar:
java -jar target/simple-batch-0.0.1-SNAPSHOT.jar

注意控制台输出。为此,运行名为jobPackPub1的作业并将该bean作为stepPackPub1.Now执行,更详细地查看以下步骤背后的组件:
•ItemReader表示检索步骤的输入
•ItemProcessor表示项目的业务处理
•ItemWriter表示步骤的输出

下图:

现在,您可以使用ItemReader,ItemProcessor和ItemWriter完成示例。可以通过使用这些组件实现Spring Batch管道和过滤器架构。

以在此处找到本文的源代码