Spring Batch 是一个轻量级的、全面的批处理框架,用于开发对企业系统的日常操作至关重要的健壮批处理应用程序。Spring Batch提供了处理大量记录所必需的可重用功能,包括日志/跟踪、事务管理、作业处理统计信息、 作业重启、跳过和资源管理。它还提供了更高级的技术服务和特性,这些特性将通过优化和分区技术支持极高容量和高性能的批处理作业。无论简单还是复杂,大容量批处理作业都可以以高度可伸缩的方式利用框架来处理大量信息。
Features(特性):
- Transaction management 事务管理
- Chunk based processing 基于块的处理
- Declarative I/O 声明式I / O
- Start/Stop/Restart 启动/停止/启动
- Retry/Skip 重试/跳过
- Web based administration interface (Spring Cloud Data Flow) 基于Web的管理接口(Spring Cloud Data Flow)
Spring batch主要有以下部分组成:
- JobRepository 用来注册job的容器
- JobLauncher 用来启动Job的接口
- Job 实际执行的任务,包含一个或多个Step
- Step step包含ItemReader、ItemProcessor和ItemWriter
- ItemReader 用来读取数据的接口
- ItemProcessor 用来处理数据的接口
- ItemWriter 用来输出数据的接口
一个Job有一个或多个Step组成,Step有读、处理、写三部分操作组成;通过JobLauncher启动Job,启动时从
JobRepository获取Job Execution;
当前运行的Job及Step的结果及状态保存在JobRepository中。
下面是Springboot集成Spring Batch 的 一个HelloSpringBatch Demo :
pom 文件,引入配置:
<dependencies>
<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.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>compile</scope>
</dependency>
<!--<dependency>-->
<!--<groupId>com.h2database</groupId>-->
<!--<artifactId>h2</artifactId>-->
<!--</dependency>-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.10</version>
</dependency>
</dependencies>
spring batch JobConfig:
配置一个job,和所属的step;此处demo,使用伪代码写入,输出,再后续博客中,将更新,基于数据库,文件等输入、输出。
package com.batch.demo.helloSpringBatch;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class JobConfiguration {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job helloWorldJob(){
return jobBuilderFactory.get("helloWorldJob")
.start(step1())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("Hello Spring Batch");
return RepeatStatus.FINISHED;
}
}).build();
}
}
application.properties:
#配置spring batch job instance 等信息存放数据源
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
spring.datasource.username=root
spring.datasource.password=123
#初始化spring batch job、step等信息存放的表,demo使用mysql
#spring.datasource.schema=classpath:/org/springframework/batch/core/schema-mysql.sql
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
#spring.batch.initialize-schema=always
#是否启动项目时候,自动执行job
#spring.batch.job.enabled = false
运行后,控制台输出:
2018-12-30 15:47:45.696 INFO 8896 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=helloWorldJob]] launched with the following parameters: [{}]
2018-12-30 15:47:45.753 INFO 8896 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1]
Hello Spring Batch
2018-12-30 15:47:45.950 INFO 8896 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=helloWorldJob]] completed with the following parameters: [{}] and the following status: [COMPLETED]
在数据库中,可以查看到job的具体信息:
到这里,一个简单的 hello world job 就已经执行完毕了。
本文主要是介绍下spring bacth的背景和架构组织,后续博客将逐步针对JobLauncher 、Job、Step、ItemReader、ItemProcessor 、ItemWriter 基于文件、数据库等存储进行批处理。
补充:
spring batch 的信息配置表创建,是根据datesource去读取,匹配执行相对应的sql进行create table。具体执行脚本在spring-batch-core下:classpath:/org/springframework/batch/core/schema-***.sql。