• springbootstarterbatch


    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 批处理

  • 相关阅读:
    Swift2.0 中的String(二):基本操作
    Swift2.0 中的String(一):常用属性
    在Swift中的ASCII到字符转换的问题
    iOS NSData
    UVALive
    Flipping Game(枚举)
    POJ 1182 :食物链(并查集)
    Java数据结构系列之——栈(2):栈的链式存储结构及其操作
    testing and SQA_动态白盒測试
    POJ 2392 Space Elevator
  • 原文地址:https://www.cnblogs.com/ooo0/p/16449667.html
Copyright © 2020-2023  润新知