导学
官网介绍:https://docs.spring.io/spring-batch/reference/spring-batch-intro.html
批处理就是将数据分批次进行处理的过程。
常规的批处理操作步骤:系统A从数据库中导出数据到文件,系统B读取文件数据并写入到数据库
批处理特点:
- 自动执行,根据系统设定的工作步骤自动完成
- 数据量大,少则百万,多则上千万甚至上亿。(如果是10亿,100亿那只能上大数据了)
- 定时执行,比如:每天,每周,每月执行。
使用场景
典型的批处理程序通常:
- 从数据库、文件或队列中读取大量记录。
- 以某种方式处理数据。
- 以修改后的形式写回数据。
Spring Batch 自动化了这个基本的批处理迭代,提供了将类似事务作为一个集合进行处理的能力,通常是在离线环境中,无需任何用户交互。批处理作业是大多数 IT 项目的一部分,Spring Batch 是唯一提供强大的企业级解决方案的开源框架。
业务场景
Spring Batch支持以下业务场景:
- 定期提交批处理过程。
- 并行批处理:对作业进行并行处理。
- 分阶段、企业消息驱动的处理。
- 大规模并行批处理。
- 故障后手动或计划重新启动。
- 相关步骤的顺序处理(扩展到工作流驱动的批处理)。
- 部分处理:跳过记录(例如,在回滚时)。
- 整个批处理事务,适用于具有小批量大小或现有存储过程或脚本的情况。
quick start - 内存版
需求:打印一个Hello Spring Batch!不带读、写和处理。
- 创建一个干净的maven项目
- 在pom.xml中添加以下依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 内存版 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 创建一个Spring Boot启动类:
@SpringBootApplication
// 加上@EnableBatchProcessing注解后,SpringBoot会自动加载 JobLauncher JobBuilderFactory StepBuilderFactory 类并创建对象交给容器管理,要使用时,直接注入即可
@EnableBatchProcessing
public class SpringBatchApplication {
public static void main(String[] args) {
org.springframework.boot.SpringApplication.run(SpringBatchApplication.class, args);
}
}
- 定义一个任务:
@Configuration
public class QuickStartH2 {
// job调度器
@Autowired
private JobLauncher jobLauncher;
// job构造器工厂
@Autowired
private JobBuilderFactory jobBuilderFactory;
// step构造器工厂
@Autowired
private StepBuilderFactory stepBuilderFactory;
/**
* 任务: step执行逻辑由tasklet实现
* @return
*/
@Bean
public Tasklet tasklet() {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("Hello Spring Batch!");
return RepeatStatus.FINISHED;
}
};
}
/**
* step: 执行逻辑(作业步骤)
* @return
*/
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(tasklet())
.build();
}
/**
* job: 任务
* @return
*/
@Bean
public Job job() {
return jobBuilderFactory.get("job-h2")
.start(step1())
.build();
}
}
批处理允许重复执行,异常重试,此时需要保存批处理状态与数据,Spring Batch 将数据缓存在H2内存中或者缓存在指定数据库中。
- 启动项目:
quick start - MySQL版
- 创建spring_batch数据库:
- 将pom.xml中的h2依赖注释掉
- application.yml文件配置数据库连接和初始化SQL脚本
注意:
sql.init.model 第一次启动为always, 后面启动需要改为never,否则每次执行SQL都会异常。第一次启动会自动执行指定的脚本,后续不需要再初始化。
spring:
datasource:
username: root
password: admin
url: jdbc:mysql://127.0.0.1:3309/spring_batch?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
# 初始化数据库,sql脚本在依赖jar中
sql:
init:
mode: always
schema-locations: classpath:org/springframework/batch/core/schema-mysql.sql
# mode: never
- 定义一个任务:
@Configuration
public class QuickStartMySql {
// job调度器
@Autowired
private JobLauncher jobLauncher;
// job构造器工厂
@Autowired
private JobBuilderFactory jobBuilderFactory;
// step构造器工厂
@Autowired
private StepBuilderFactory stepBuilderFactory;
/**
* 任务: step执行逻辑由tasklet实现
* @return
*/
@Bean
public Tasklet tasklet() {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("Hello Spring Batch!");
return RepeatStatus.FINISHED;
}
};
}
/**
* step: 执行逻辑(作业步骤)
* @return
*/
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(tasklet())
.build();
}
/**
* job: 任务
* @return
*/
@Bean
public Job job() {
return jobBuilderFactory.get("job-MySQL")
.start(step1())
.build();
}
}
- 启动项目:
- 数据库:
github笔记