官网介绍:Spring Batch Introduction
SpringBatch:就是将数据分批次进行处理的过程。比如:银行对账逻辑,跨系统数据同步等。
常规的批处理操作步骤:系统A从数据库中导出数据到文件,系统B读取文件数据并写入到数据库
-
Sping Batch 是一个轻量级的、完善的的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。
-
Spring Batch 是Spring的一个子项目,基于Spring框架为基础的开发的框架
-
Spring Batch 提供大量可重用的组件,比如:日志,追踪,事务,任务作业统计,任务重启,跳过,重复,资源管理等
-
Spring Batch 是一个批处理应用框架,不提供调度框架,如果需要定时处理需要额外引入-调度框架,比如: Quartz
SpringBatch架构
Spring Batch 核心架构分三层:应用层,核心层,基础架构层。
Application:应用层,包含所有的批处理作业,程序员自定义代码实现逻辑。
Batch Core:核心层,包含Spring Batch启动和控制所需要的核心类,比如:JobLauncher, Job,Step等。
Batch Infrastructure:基础架构层,提供通用的读,写与服务处理。
批量处理流程
-
JobLauncher启动一个Job,并将Job的控制权传递给JobRepository。
-
JobRepository管理Job的执行状态和元数据,包括Job的名称、创建时间、最后一次执行时间、执行状态等。
-
JobRepository创建一个JobExecution实例,表示该Job的一次执行,并将JobExecution的控制权传递给Job。
-
Job包含一个或多个Step,每个Step定义了批量处理的一个独立的执行单元。Step包含三个组件:ItemReader、ItemProcessor和ItemWriter。
-
ItemReader从外部资源中读取数据,例如文件、数据库等。读取的数据会被传递给ItemProcessor进行处理。
-
ItemProcessor对读取的数据进行转换或者过滤操作,并将处理后的数据传递给ItemWriter。
-
ItemWriter将处理后的数据写入到指定的输出目标中,例如文件、数据库等。
-
Step将处理后的数据传递给Job,并通知Job该Step已经完成。
-
如果Job包含多个Step,则Job会依次执行每个Step,直到所有的Step都完成。
-
当Job的所有Step都完成后,JobExecution的状态会被更新,并通知JobLauncher。
-
JobLauncher会收到JobExecution的状态更新信息,判断Job是否执行成功或者失败,如果Job执行失败,JobLauncher可以选择重新启动Job或者采取其他的措施。
入门案例
引入web 和mysql驱动
application.properties
启动类
package com.example.springbatch1;
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.launch.JobLauncher;
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.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableBatchProcessing
public class Springbatch1Application {
//job调度器
@Autowired
private JobLauncher jobLauncher;
//job构造器工厂
@Autowired
private JobBuilderFactory jobBuilderFactory;
//step构造器工厂
@Autowired
private StepBuilderFactory stepBuilderFactory;
//任务-step执行逻辑由tasklet完成
@Bean
public Tasklet tasklet(){
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("Hello SpringBatch....");
return RepeatStatus.FINISHED;
}
};
}
//作业步骤-不带读/写/处理
@Bean
public Step step1(){
return stepBuilderFactory.get("step1")
.tasklet(tasklet())
.build();
}
//定义作业
@Bean
public Job job(){
return jobBuilderFactory.get("hello-job")
.start(step1())
.build();
}
public static void main(String[] args) {
SpringApplication.run(Springbatch1Application.class, args);
}
}
新建库