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表中
文章来源: Spring Boot+Vue全栈开发实战 - 13.3 批处理