Spring batch系列文章(一)——介绍和入门
文章目录
Spring Batch 简介
关于 spring batch 的简介,官方说法,网上随便一搜就有,这里就不再赘述了,大概就是批量处理数据的一种轻量级框架,通常不需要人工参与就能够自动高效的进行复杂的数据处理和分析。如:定期对大量数据进行业务数据处理,或者从内部系统或者外部系统获得的数据进行处理后集成到其他系统中,这样的工作都叫“批处理”。
批处理的特点
典型的批处理应用一般都有这样的特点:
- 自动执行,根据系统设定的步骤自动执行。
- 数据量大,通常是百万千万或者亿级。
- 定时执行,每天、每周、定时的执行。
整个流程一共分为三个阶段:
- 读数据,数据可以来自文件、数据库、消息队列等;
- 处理数据,处理读取的数据,并生成处理结果。
- 写数据,把处理后的数据写入文件、数据库、消息队列等。
spring batch 的好基友
spring batch 只是一个批处理的应用框架,没有调度功能,一般需要和调度框架进行合作来构建完成批处理任务。它只关注批处理任务相关的问题,如事务、并发、监控、执行等,并不提供相应的调度功能。如果需要使用调度框架,可以和很多优秀的调度框架一起使用,如 Quartz 等。
spring batch 集成 spring boot 的入门程序
maven 配置
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
<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>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
application 启动类
配置完成后,添加一个 springboot 启动类,我创建了一个 pers.buyusan.batch 包,在包下创建了 SpringBatchApplication 类:
@SpringBootApplication
public class SpringBatchApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBatchApplication.class, args);
}
}
配置数据源,我习惯 yaml 文件:
spring:
datasource:
url: jdbc:mysql://localhost:3306/springbatch?characterEncoding=utf8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
schema: classpath:/org/springframework/batch/core/schema-mysql.sql
batch:
initialize-schema: always
JobConfig
spring batch 是通过 job,也就是任务,作为任务执行的容器,所以要先生成 job 对象,通过框架提供的 JobBuildFactory 类,有了 job 后,每个任务都要分步骤执行,也就是 step 对象,step 对象通过 StepBuildFactory 类去创建。step 的执行可以通过两种方式:chunk 和 tasklet。我先用 tasklet 方式进行一个简单 helloworld 的输出任务编写。
创建 config 包,在包中创建一个 JobConfiguration 类。
@Configuration
@EnableBatchProcessing
public class JobConfiguration {
//注入创建任务对象的对象
@Autowired
private JobBuilderFactory jobBuilderFactory;
//任务的执行由 step 决定
//注入创建 step 对象的对象
@Autowired
private StepBuilderFactory stepBuilderFactory;
//创建任务对象
@Bean
public Job helloWorldJob(){
return jobBuilderFactory.get("helloWorldJob")
.start(step1())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("helloWorldStep")
.tasklet((contribution, chunkContext) -> {
System.out.println("hello world");
return RepeatStatus.FINISHED;
})
.build();
}
}
现在为止,我的目录结构如下:
运行启动类后,可以看到程序顺利执行:
再去数据库看一下表,spring batch已经自动创建了好几张表,如图:
打开batch_job_execution可以看到
打开batch_job_instance可以看到
打开batch_step_execution可以看到
刚刚执行的记录已经都在里面生成啦。