spring-boot-starter-batch
Spring Batch简介
Spring Batch是一个开源的、全面的、轻量级的批处理框架,通过Spring Batch可以实现强大的批处理应用程序的开发。
Spring Batch还提供记录/跟踪、事务管理、作业处理统计、作业重启以及资源管理等功能。
Spring Batch结合定时任务可以发挥更大的作用。
Spring Batch提供了ItemReader、ItemProcessor和ItemWriter来完成数据的读取、处理以及写出操作,并且可以将批处理的执行状态持久化到数据库中。
整合Spring Boot
现在有一个data.csv文件,文件中保存了4条用户数据,通过批处理框架读取data.csv,将之插入数据表中。
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</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>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-test</artifactId>
<scope>test</scope>
</dependency>
数据库基本信息配置:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/batch?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
schema: classpath:/org/springframework/batch/core/schema-mysql.sql # 项目启动时创建数据表的SQL脚本,该脚本由Spring Batch提供
batch:
initialize-schema: always # 项目启动时执行建表SQL
job:
enabled: false # 配置后则不会自动执行,而需要用户手动触发执行
开启Spring Batch支持:
在项目启动类上添加@EnableBatchProcessing注解开启Spring Batch支持
@EnableBatchProcessing // 开启Spring Batch支持
@SpringBootApplication
public class XcSpringbootApplication {
配置批处理:
@Configuration
public class CsvBatchJobConfig {
@Autowired
JobBuilderFactory jobBuilderFactory;
@Autowired
StepBuilderFactory stepBuilderFactory;
@Autowired
DataSource dataSource;
/**
* Spring Batch提供了一些常用的ItemReader,
* 例如JdbcPagingItemReader用来读取数据库中的数据,
* StaxEventItemReader用来读取XML数据,
* 本案例中的FlatFileItemReader则是一个加载普通文件的ItemReader
*/
@Bean
@StepScope
FlatFileItemReader<User> itemReader() {
FlatFileItemReader<User> reader = new FlatFileItemReader<>();
reader.setLinesToSkip(1);//跳过一行
reader.setResource(new ClassPathResource("data.csv"));//配置data.csv文件的位置
reader.setLineMapper( // 通过setLineMapper方法设置每一行的数据信息
new DefaultLineMapper<User>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames("id", "username", "address", "gender"); // setNames方法配置了data.csv文件一共有4列
setDelimiter("\t"); // setDelimiter则是配置列与列之间的间隔符
}});
// 设置要映射的实体类属性
setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() {{
setTargetType(User.class);
}});
}});
return reader;
}
/**
* Spring Batch也提供了多个ItemWriter的实现,
* 常见的如FlatFileItemWriter,表示将数据写出为一个普通文件,
* StaxEventItemWriter表示将数据写出为XML。
* 另外,还有针对不同数据库提供的写出操作支持类,如MongoItemWriter、JpaItemWriter、Neo4jItemWriter以及HibernateItemWriter等,
* 本案例使用的JdbcBatchItemWriter则是通过JDBC将数据写出到一个关系型数据库中。
*/
@Bean
JdbcBatchItemWriter jdbcBatchItemWriter() {
JdbcBatchItemWriter writer = new JdbcBatchItemWriter();
writer.setDataSource(dataSource);
// JdbcBatchItemWriter主要配置数据以及数据插入SQL,注意占位符的写法是“:属性名”
writer.setSql("insert into user(id,username,address,gender) values(:id,:username,:address,:gender)");
// 通过BeanPropertyItemSqlParameterSourceProvider实例将实体类的属性和SQL中的占位符一一映射
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
return writer;
}
/**
* 配置一个Step
*/
@Bean
Step csvStep() {
/*
* Step通过stepBuilderFactory进行配置,首先通过get获取一个StepBuilder,
* get方法的参数就是该Step的name
* 然后调用chunk方法的参数2,表示每读取到两条数据就执行一次write操作,
* 最后分别配置reader和writer。
*/
return stepBuilderFactory.get("csvStep")
.<User, User>chunk(2)
.reader(itemReader())
.writer(jdbcBatchItemWriter())
.build();
}
/**
* 配置一个Job
*/
@Bean
Job csvJob() {
/*
* 通过jobBuilderFactory构建一个Job,
* get方法的参数为Job的name,
* 然后配置该Job的Step即可
*/
return jobBuilderFactory.get("csvJob")
.start(csvStep())
.build();
}
}
创建Controller:
@RestController
public class BatchController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@GetMapping("/batch")
public void hello() {
try {
//JobLauncher由框架提供,Job则是刚刚配置的,通过调用JobLauncher中的run方法启动一个批处理
jobLauncher.run(job, new JobParameters());
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试:
最后根据上文的实体类在数据库中创建一个user表,然后启动Spring Boot工程并访问接口,访问成功后,batch库中会自动创建出多个批处理相关的表,这些表用来记录批处理的执行状态,同时,data.csv中的数据也已经成功插入user表中