SpringBoot批处理的实现示例

 更新时间:2022年03月15日 10:58:50   作者:清雨未尽时  
SpringBatch是一个开源 的、全面的、轻量级的批处理框架,通过SpringBoot可以实现强大的批处理应用程序开发,本文主要介绍了SpringBoot批处理的实现示例,感兴趣的可以了解一下

Spring Batch是一个开源 的、全面的、轻量级的批处理框架,通过Spring  Boot 可以实现强大的批处理应用程序开发。

Spring Batch提供了ItemReader、ItemProcessor和ItemWriter来完成数据的读取、处理及写出操作,并且可以将批处理的执行状态 持久化到数据库中。

https://spring.io/projects/spring-batch

1.添加依赖

<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>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.9</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

2.添加配置 信息

server.port=9000
spring.http.encoding.force-response=true
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql:///batch
spring.datasource.username  = root
spring.datasource.password  = kangxg198811
#项目启动时创建数据表的SQL脚本
spring.datasource.schema=classpath:/org/springframework/batch/core/schema-mysql.sql
#项目启动时执行建表SQL
spring.batch.initialize-schema=always
#配置后不会自动执行
spring.batch.job.enabled=false

3.在项目启动类上添加@EnableBatchProcessing注解开开启Spring Batch支持

@SpringBootApplication
@EnableBatchProcessing
public class BatchApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(BatchApplication.class, args);
    }
 
}

4.配置批处理

@Configuration
public class CsvBatchJobConfig {
    @Autowired
    JobBuilderFactory jobBuilderFactory;
 
    @Autowired
    StepBuilderFactory stepBuilderFactory;
 
    @Autowired
    DataSource dataSource;
 
    class CustomLineCallbackHandler implements LineCallbackHandler{
        @Override
        public void handleLine(String result)
        {
            System.out.println(result);
        }
    }
    @Bean
    ItemReader<User> itemReader()
    {
         FlatFileItemReader<User> reader = new FlatFileItemReader<User>();
         reader.setLinesToSkip(1);
         reader.setResource(new ClassPathResource("data.csv"));
         reader.setLineMapper(new DefaultLineMapper<User>(){
             {
                 setLineTokenizer(new DelimitedLineTokenizer(){{
                     setNames(new String[]{"id","username","address","gender"});
                     //setDelimiter("\t");
                 }});
                 setFieldSetMapper(new BeanWrapperFieldSetMapper<User>(){{
                     setTargetType(User.class);
                 }});
 
             }
         });
         reader.setSkippedLinesCallback(new CustomLineCallbackHandler());
         return reader;
    }
 
    @Bean
    JdbcBatchItemWriter jdbcBatchItemWriter()
    {
        JdbcBatchItemWriter writer = new JdbcBatchItemWriter();
        writer.setDataSource(dataSource);
        writer.setSql("insert into user(id,username,address,gender)" + "values(:id,:username,:address,:gender)");
        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider());
        return  writer;
    }
 
    @Bean
    Step csvStep()
    {
        return  stepBuilderFactory.get("csvStep")
                .<User,User>chunk(2)
                .reader(itemReader())
                .writer(jdbcBatchItemWriter())
                .build();
    }
 
    @Bean
    Job csvJob()
    {
        return jobBuilderFactory.get("csvJob")
                .start(csvStep())
                .build();
    }
 
}

5.实体类

public class User {
    private Integer id;
 
    private String username;
 
    private  String address;
 
    private  String gender;
    public User(Integer id,String username,String address,String gender)
    {
        this.username= username;
        this.id = id;
        this.address = address;
        this.gender = gender;
    }
 
    public  User()
    {
        super();
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public void setAddress(String address) {
        this.address = address;
    }
 
    public String getUsername() {
        return username;
    }
 
    public String getGender() {
        return gender;
    }
    
    public Integer getId() {
        return id;
    }
    
    public String getAddress() {
        return address;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

6.创建Controller

@RestController
public class BatchController {
    @Autowired
    JobLauncher jobLauncher;
 
    @Autowired
    Job job;
 
    @GetMapping("/batch")
    public void batch()
    {
        try {
            jobLauncher.run(job,new JobParametersBuilder().toJobParameters());
 
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
 
}

这里配置就结束了,数据库会增加一些自动创建到表,但是User表不能自动创建和字段需要提前设置,否则会出现错误,还需要进一步处理,待完成。暂做标记!

到此这篇关于SpringBoot批处理的实现示例的文章就介绍到这了,更多相关SpringBoot批处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea如何关闭右侧类显示方法

    idea如何关闭右侧类显示方法

    这篇文章主要介绍了idea如何关闭右侧类显示方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 浅谈Redis持久化的几种方式

    浅谈Redis持久化的几种方式

    这篇文章主要介绍了浅谈Redis持久化的几种方式,前面说到了Redis持久化的 实现方式主要分为了:快照持久化(RDB)、写日志持久化(AOF)
    ,其中快照持久化方式也就是RDB ,需要的朋友可以参考下
    2023-08-08
  • SpringBoot配置SSL同时支持http和https访问实现

    SpringBoot配置SSL同时支持http和https访问实现

    本文主要介绍了SpringBoot配置SSL同时支持http和https访问实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java中抽象类的作用及说明

    Java中抽象类的作用及说明

    这篇文章主要介绍了Java中抽象类的作用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 基于@GetMapping注解携带参数的方式

    基于@GetMapping注解携带参数的方式

    这篇文章主要介绍了基于@GetMapping注解携带参数的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Java如何对返回参数进行处理

    Java如何对返回参数进行处理

    这篇文章主要介绍了Java如何对返回参数进行处理问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 浅谈java中Map的用法

    浅谈java中Map的用法

    Map简介:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。
    2015-09-09
  • 有关ServletConfig与ServletContext的访问

    有关ServletConfig与ServletContext的访问

    下面小编就为大家带来一篇有关ServletConfig与ServletContext的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Java中基于Nacos实现Sentinel规则持久化详解

    Java中基于Nacos实现Sentinel规则持久化详解

    这篇文章主要介绍了Java中基于Nacos实现Sentinel规则持久化详解,Sentinel Dashboard中添加的规则数据存储在内存,微服务停掉规则数据就消失,在⽣产环境下不合适,我们可以将Sentinel规则数据持久化到Nacos配置中⼼,让微服务从Nacos获取规则数据,需要的朋友可以参考下
    2023-09-09
  • java求整数的位数方式

    java求整数的位数方式

    这篇文章主要介绍了java求整数的位数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论