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表中