详解SpringBoot和SpringBatch 使用

什么是Spring Batch

Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使的已经使用 Spring 框架的开发者或者企业更容易访问和利用企业服务。

Spring Batch 提供了大量可重用的组件,包括了日志、追踪、事务、任务作业统计、任务重启、跳过、重复、资源管理。对于大数据量和高性能的批处理任务,Spring Batch 同样提供了高级功能和特性来支持,比如分区功能、远程功能。总之,通过 Spring Batch 能够支持简单的、复杂的和大数据量的批处理作业。

Spring Batch 使用

我们首先配置Spring Batch 在Spring Boot 中的使用,数据库用的是mysql,pom文件如下,因为Spring Boot 中的Spring Batch 包含 hsqsldb 所以我们将其去除

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-batch</artifactId>
      <exclusions> <!-- 注意这里-->
        <exclusion>
          <groupId>org.hsqldb</groupId>
          <artifactId>hsqldb</artifactId>
        </exclusion>
      </exclusions>
    </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>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.21</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>

配置好我们需要的实体类。页面就不展示了。

如果有数据校验添加的话那么我们需要配置自定义的检验器。若果没有课略过该步骤

public class CsvBeanValidator<T> implements Validator<T>,InitializingBean {
  private javax.validation.Validator  validator;
  @Override
  public void validate(T value) throws ValidationException {
    Set<ConstraintViolation<T >> constraintViolations=validator.validate(value);
    if(constraintViolations.size()>0){
      StringBuilder message=new StringBuilder();
      for(ConstraintViolation<T> constraintViolation:constraintViolations){
        message.append(constraintViolation.getMessage() +"\n");
      }
      throw new ValidationException(message.toString());
    }
  }
  //在这里我们使用的是JSR-303校验数据,在此进行初始化
  @Override
  public void afterPropertiesSet() throws Exception {
    ValidatorFactory validatorFactory= Validation.buildDefaultValidatorFactory();
    validator=validatorFactory.usingContext().getValidator();
  }
}
public class CsvItemProcessor extends ValidatingItemProcessor<Person> {
  @Override
  public Person process(Person item) throws ValidationException {
     super.process(item); // 在这里启动 然后才会调用我们自定义的校验器,否则不能通过 。
     if (item.getNation().equals("汉族")){
       item.setName("01");
     }else{
       item.setNation("02");
     }
     return item;
  }
}

进行job任务监听 自定义类实现JobExecutionListener 即可

long startTime;
 long endTime;
 @Override
 public void beforeJob(JobExecution jobExecution) {
   startTime = System.currentTimeMillis();
   System.out.println("任务处理开始");
 }
 @Override
 public void afterJob(JobExecution jobExecution) {
   endTime = System.currentTimeMillis();
   System.out.println("耗时多长时间:" + (endTime - startTime) + "ms");
   System.out.println("任务处理结束");
 }

进行Spring Batch 的注入 方法有xml文件注入bean ,在这里选择java注入

@Configuration
@EnableBatchProcessing //开启批处理
public class CsvBatchConfig {
  /**1 首先我们通过 FlatFileItemReader 读取我们需要的文件 通过setResource来实现
   * 2 设置map 在这里通过先设置解析器 setLineTokenizer 来解析我们csv文件中的数   据
   * 3 setFieldSetMapper 将我们需要的数据转化为我们的实体对象 存储
   * 4 如果想 跳过前面的几行 需要使用setLinesToSkip就可以实现
   */
 @Bean
 public ItemReader<Person> reader() throws Exception {
   FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>(); //1
   reader.setResource(new ClassPathResource("people.csv")); //2
     reader.setLineMapper(new DefaultLineMapper<Person>() {{ //3
       setLineTokenizer(new DelimitedLineTokenizer() {{
         setNames(new String[] { "name","age", "nation" ,"address"});
       }});
       setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
         setTargetType(Person.class);
       }});
     }});
       reader.setLinesToSkip(3);
     return reader;
 }
 @Bean
 public ItemProcessor<Person, Person> processor() {
   CsvItemProcessor processor = new CsvItemProcessor(); //1
   processor.setValidator(csvBeanValidator()); //2
   return processor;
 }
   /**
    *写入数据到数据库中
    * 1执行的sql 语句 2 设置数据源
     */
 @Bean
 public ItemWriter<Person> writer(DataSource dataSource) {//1
   JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>(); //2
   writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
   String sql = "insert into person " + "(id,name,age,nation,address) "
       + "values(hibernate_sequence.nextval, :name, :age, :nation,:address)";
   writer.setSql(sql); //3
   writer.setDataSource(dataSource);
   return writer;
 }
  // 作业的仓库 就是设置数据源
 @Bean
 public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager transactionManager)
     throws Exception {
   JobRepositoryFactoryBean jobRepositoryFactoryBean = new JobRepositoryFactoryBean();
   jobRepositoryFactoryBean.setDataSource(dataSource);
   jobRepositoryFactoryBean.setTransactionManager(transactionManager);
   jobRepositoryFactoryBean.setDatabaseType("mysql");
   return jobRepositoryFactoryBean.getObject();
 }
   //调度器 使用它来执行 我们的批处理
 @Bean
 public SimpleJobLauncher jobLauncher(DataSource dataSource, PlatformTransactionManager transactionManager)
     throws Exception {
   SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
   jobLauncher.setJobRepository(jobRepository(dataSource, transactionManager));
   return jobLauncher;
 }
   //将监听器加入到job中
 @Bean
 public Job importJob(JobBuilderFactory jobs, Step s1) {
   return jobs.get("importJob")
       .incrementer(new RunIdIncrementer())
       .flow(s1) //1
       .end()
       .listener(csvJobListener()) //2
       .build();
 }
   //步骤绑定 reader 与writer 一次性处理65000条记录
 @Bean
 public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader<Person> reader, ItemWriter<Person> writer,
     ItemProcessor<Person,Person> processor) {
   return stepBuilderFactory
       .get("step1")
       .<Person, Person>chunk(65000) //1
       .reader(reader) //2
       .processor(processor) //3
       .writer(writer) //4
       .build();
 }
 @Bean
 public CsvJobListener csvJobListener() {
   return new CsvJobListener();
 }
 @Bean
 public Validator<Person> csvBeanValidator() {
   return new CsvBeanValidator<Person>();
 }
}

在配置文件中 启动自动执行批处理

spring.batch.job.names = job1,job2 #启动时要执行的Job,默认执行全部Job

spring.batch.job.enabled=true #是否自动执行定义的Job,默认是

spring.batch.initializer.enabled=true #是否初始化Spring Batch的数据库,默认为是

spring.batch.schema=

spring.batch.table-prefix= #设置SpringBatch的数据库表的前缀

项目汇总

从 项目中我们可以看到 总的步骤就是 首先读取我们需要实现的文件进行解析,然后转换成需要的实体类并且绑定到reader中,二 实现我们需要的writer 并且帮到到数据库上,三实现job监听器将其绑定到步骤中 。最后开启批处理 自动执行入库即可 。这个简单步骤主要是配置中用到的 理解流程 自己也可以方便实现 批处理的流程。

总结

以上所述是小编给大家介绍的SpringBoot和SpringBatch 使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 浅谈Springboot整合RocketMQ使用心得

    一.阿里云官网---帮助文档 https://help.aliyun.com/document_detail/29536.html?spm=5176.doc29535.6.555.WWTIUh 按照官网步骤,创建Topic.申请发布(生产者).申请订阅(消费者) 二.代码 1.配置: public class MqConfig { /** * 启动测试之前请替换如下 XXX 为您的配置 */ public static final String PUBLIC_TOPIC = "test"

  • Spring Boot 中使用cache缓存的方法

    一.什么是缓存 Cache Cache 一词最早来自于CPU设计 当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理:没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存.正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在CPU缓存中,只有大约10%需要从内存读取.这大大节省了CPU直接读取内存的

  • Spring Boot中使用MongoDB的连接池配置的方法

    因为今天开发遇到了性能问题,可能与MongoDB的连接有关,所以稍稍深入看了一下,正好搜到原来有人写过这篇相关的内容,所以转载过来.回头有时间可以写个扩展到SpringForAll里,主体思路还是一样的.感谢这位美女程序媛的文章! 说明 Spring Boot中通过依赖 spring-boot-starter-data-mongodb ,来实现 spring-data-mongodb 的自动配置. 但是默认情况下,Spring Boot 中,并没有像使用MySQL或者Redis一样,提供了连接池

  • Spring Boot使用Allatori代码混淆的方法

    Allatori混淆技术介绍 Allatori是一个Java 混淆器,它属于第二代混淆器,因此它能够全方位地保护你的知识产权. Allatori具有以下几种保护方式:命名混淆,流混淆,调试信息混淆,字符串混淆,以及水印技术.对于教育和非商业项目来说这个混淆器是免费的.支持war和jar文件格式,并且允许对需要混淆代码的应用程序添加有效日期. 有项目需要对代码进行保护,比较初级的方案就是对代码进行混淆,打包之后的文件进行反编译后,就可以看到效果.此外,使用Allatori打的包体积也会小一点. 工

  • 详解spring batch的使用和定时器Quart的使用

    spring Batch是一个基于Spring的企业级批处理框架,它通过配合定时器Quartz来轻易实现大批量的数据读取或插入,并且全程自动化,无需人员管理. 在使用spring batch之前,得对spring batch的流程有一个基本了解 每个batch它都包含了一个job,而一个job中却有可能包含多个step,整个batch中干活的是step,batch主要是用来对数据的操作,所以step就有三个操作数据的东西,一个是ItemReader用来读取数据的,一个是ItemProcessor

  • SpringBoot + Spring Security 基本使用及个性化登录配置详解

    Spring Security 基本介绍 这里就不对Spring Security进行过多的介绍了,具体的可以参考官方文档 我就只说下SpringSecurity核心功能: 认证(你是谁) 授权(你能干什么) 攻击防护(防止伪造身份) 基本环境搭建 这里我们以SpringBoot作为项目的基本框架,我这里使用的是maven的方式来进行的包管理,所以这里先给出集成Spring Security的方式 <dependencies> ... <dependency> <groupI

  • SpringBoot Admin 使用指南(推荐)

    Spring Boot Admin 是一个管理和监控你的 Spring Boot 应用程序的应用程序. 这些应用程序通过 Spring Boot Admin Client(通过 HTTP)注册或者使用 Spring Cloud(例如 Eureka)发现. UI只是 Spring Boot Actuator 端点上的一个 AngularJs 应用程序. 快速开始 首先在 IDEA 创建一个 SpringBoot 项目,把它当作 server 端,工程如下: 然后在 pom.xml 中引入依赖: <

  • 详解SpringBoot和SpringBatch 使用

    什么是Spring Batch Spring Batch 是一个轻量级的.完善的批处理框架,旨在帮助企业建立健壮.高效的批处理应用.Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使的已经使用 Spring 框架的开发者或者企业更容易访问和利用企业服务. Spring Batch 提供了大量可重用的组件,包括了日志.追踪.事务.任务作业统计.任务重启.跳过.重复.资源管理.对于大数据量和高性能的批处理任务,Spring Batch 同样提供了

  • 详解SpringBoot之添加单元测试

    本文介绍了详解SpringBoot之添加单元测试,分享给大家,希望此文章对各位有所帮助 在SpringBoot里添加单元测试是非常简单的一件事,我们只需要添加SpringBoot单元测试的依赖jar,然后再添加两个注解就可搞定了. 首先我们来添加单元测试所需要的jar <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test<

  • 详解Springboot配置文件的使用

    如果使用IDEA创建Springboot项目,默认会在resource目录下创建application.properties文件,在springboot项目中,也可以使用yml类型的配置文件代替properties文件 一.单个的获取配置文件中的内容 在字段上使用@Value("${配置文件中的key}")的方式获取单个的内容 1.在resource目录下创建application.yml文件,并添加一些配置,在yml文件中,key:后面需要添加一个空格,然后是value值,假设配置如

  • 详解springboot整合ehcache实现缓存机制

    EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心容量问题. spring-boot是一个快速的集成框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 由于spring-boot无需任何样板化的配置文件,所以spring-boot集成一些其他框架时会有略微的

  • 详解Springboot整合ActiveMQ(Queue和Topic两种模式)

    写在前面: 从2018年底开始学习SpringBoot,也用SpringBoot写过一些项目.这里对学习Springboot的一些知识总结记录一下.如果你也在学习SpringBoot,可以关注我,一起学习,一起进步. ActiveMQ简介 1.ActiveMQ简介 Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件:由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行. 2.ActiveMQ下载 下载地址:htt

  • 详解springboot+aop+Lua分布式限流的最佳实践

    一.什么是限流?为什么要限流? 不知道大家有没有做过帝都的地铁,就是进地铁站都要排队的那种,为什么要这样摆长龙转圈圈?答案就是为了限流!因为一趟地铁的运力是有限的,一下挤进去太多人会造成站台的拥挤.列车的超载,存在一定的安全隐患.同理,我们的程序也是一样,它处理请求的能力也是有限的,一旦请求多到超出它的处理极限就会崩溃.为了不出现最坏的崩溃情况,只能耽误一下大家进站的时间. 限流是保证系统高可用的重要手段!!! 由于互联网公司的流量巨大,系统上线会做一个流量峰值的评估,尤其是像各种秒杀促销活动,

  • 详解springboot启动时是如何加载配置文件application.yml文件

    今天启动springboot时,明明在resources目录下面配置了application.yml的文件,但是却读不出来,无奈看了下源码,总结一下springboot查找配置文件路径的过程,能力有限,欢迎各位大牛指导!!! spring加载配置文件是通过listener监视器实现的,在springboot启动时: 在容器启动完成后会广播一个SpringApplicationEvent事件,而SpringApplicationEvent事件是继承自ApplicationEvent时间的,代码如下

  • 详解springboot整合ueditor踩过的坑

    有一天老板突然找我让我改富文本(一脸懵逼,不过也不能推啊默默地接下了),大家都知道现在的富文本视频功能都是只有上传链接的没有从本地上传这一说(就连现在的csdn的也是)于是我找了好多个,最终发现百度的ueditor可以. 经过几天的日夜,甚至牺牲了周末休息时间开始翻阅资料... 废话不多说,开始教程: 第一步: 去ue官网下载他的源码 第二步: 解压下载的源码(下载可能会慢,好像需要翻墙下载) 然后打开项目把源码拖进项目的resources/static中去 第三步 就是重点了 由于spring

  • 详解SpringBoot 应用如何提高服务吞吐量

    意外和明天不知道哪个先来.没有危机是最大的危机,满足现状是最大的陷阱. 背景 生产环境偶尔会有一些慢请求导致系统性能下降,吞吐量下降,下面介绍几种优化建议. 方案 1.undertow替换tomcat 电子商务类型网站大多都是短请求,一般响应时间都在100ms,这时可以将web容器从tomcat替换为undertow,下面介绍下步骤: 1.增加pom配置 <dependency> <groupid> org.springframework.boot </groupid>

  • 详解SpringBoot Redis自适应配置(Cluster Standalone Sentinel)

    核心代码段 提供一个JedisConnectionFactory  根据配置来判断 单点 集群 还是哨兵 @Bean @ConditionalOnMissingBean public JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory factory = null; String[] split = node.split(","); Set<HostAndPort> nodes =

随机推荐