栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBatch批处理框架入门(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBatch批处理框架入门(二)

这篇文章接上一篇SpringBatch批处理框架入门(一),继续讲解SpringBatch基础知识。

SpringBatch 核心类介绍

下图是我们要讲解spring batch几个核心类:

 SpringBatch 核心类Job

Job是封装整个批处理过程的一个概念。Job在spring batch的体系当中是一个最顶层的抽象概念。

一个job是我们运行的基本单位,它内部由step组成。job本质上可以看成step的一个容器。一个job可以按照指定的逻辑顺序组合step,并提供了我们给所有step设置相同属性的方法,例如一些事件监听,跳过策略。

Spring Batch以SimpleJob类的形式提供了Job接口的默认简单实现,它在Job之上创建了一些标准功能。一个使用java bean的例子代码如下:

@Bean
 public Job cafeCatJob() {
   return jobBuilderFactory.get("cafeCatJob")
       .start(cafeCatStep())
       .build();
 }

SpringBatch 核心类Step

带有步骤的作业层次结构:

 SpringBatch 核心类StepExecution

StepExecution表示一次执行Step, 每次运行一个Step时都会创建一个新的StepExecution,类似于JobExecution。 但是,某个步骤可能由于其之前的步骤失败而无法执行。 且仅当Step实际启动时才会创建StepExecution。

一次step执行的实例由StepExecution类的对象表示。 每个StepExecution都包含对其相应步骤的引用以及JobExecution和事务相关的数据,例如提交和回滚计数以及开始和结束时间。 此外,每个步骤执行都包含一个ExecutionContext,其中包含开发人员需要在批处理运行中保留的任何数据,例如重新启动所需的统计信息或状态信息。

下面是一个从数据库当中截图的实例:

SpringBatch 核心类ExecutionContext

ExecutionContext即每一个JobExecution和StepExecution 的执行环境。它包含一系列的键值对。我们可以用如下代码获取ExecutionContext

  • ExecutionContext stepContext= stepExecution.getExecutionContext();
  • ExecutionContext jobContext = jobExecution.getExecutionContext();

SpringBatch 核心类JobRepository

JobRepository是一个用于将上述job,step等概念进行持久化的一个类。 它同时给Job和Step以及下文会提到的JobLauncher实现提供CRUD操作。 首次启动Job时,将从repository中获取JobExecution,并且在执行批处理的过程中,StepExecution和JobExecution将被存储到repository当中。

@EnableBatchProcessing注解可以为JobRepository提供自动配置。

SpringBatch 核心类JobLauncher

JobLauncher这个接口的功能非常简单,它是用于启动指定了JobParameters的Job,为什么这里要强调指定了JobParameter,原因其实我们在前面已经提到了,jobparameter和job一起才能组成一次job的执行。

SpringBatch 核心类ItemReader和ItemWriter

ItemReader是一个读数据的接口, 当ItemReader读完所有数据时,返回null表示后续操作数据已经读完。Spring Batch为ItemReader提供了非常多的实现类。

ItemWriter是一个写数据的接口,Spring Batch为ItemWriter提供了非常多的实现类。

  • 操作单个文件:FlatFileItemReader 和 FlatFileItemWriter
  • 操作多个文件:MultiResourceItemReader 和 MultiResourceItemWriter
  • 操作数据库:JdbcPagingItemReader 和 JdbcBatchItemWriter

          MyBatisPagingItemReader 和 MyBatisBatchItemWriter

  • 操作XML文件:StaxEventItemReader 和 StaxEventItemWriter
  • 操作JSON文件:JsonItemReader 和 JsonFileItemWriter

SpringBatch 核心类ItemProcessor 

ItemProcessor对项目的业务逻辑处理的一个抽象, 当ItemReader读取到一条记录之后,ItemWriter还未写入这条记录之前,I我们可以借助temProcessor提供一个处理业务逻辑的功能,并对数据进行相应操作。如果我们在ItemProcessor发现一条数据不应该被写入,可以通过返回null来表示。

SpringBatch 核心类Chunk

一个chunk处理流程如右图

一次batch的任务可能会有很多的数据读写操作,因此一条一条的处理并向数据库提交的话效率不会很高,因此spring batch提供了chunk这个概念,我们可以设定一个chunk size,spring batch 将一条一条处理数据,但不提交到数据库,只有当处理的数据数量达到chunk size设定的值得时候,才一起去commit。

 SpringBatch 监听器

Spring Batch提供了多种监听器Listener,用于在任务处理过程中触发我们的逻辑代码。常用的监听器根据粒度从粗到细分别有:Job级别的监听器JobExecutionListener、Step级别的监听器StepExecutionListener、Chunk监听器ChunkListener、ItemReader监听器ItemReadListener、ItemWriter监听器ItemWriteListener和ItemProcessor监听器ItemProcessListener和SkipListener等。具体可以参考下表:

监听器

具体说明

JobExecutionListener

在Job开始之前(beforeJob)和之后(aflerJob)触发

StepExecutionListener

在Step开始之前(beforeStep)和之后(afterStep)触发

ChunkListener

在 Chunk 开始之前(beforeChunk),之后(afterChunk)和错误后(afterChunkError)触发

ItemReadListener

在 Read 开始之前(beforeRead),之后(afterRead)和错误后(onReadError)触发

ItemProcessListener

在 Processor 开始之前(beforeProcess),之后(afterProcess)和错误后(onProcessError)触发

ItemWriteListener

在 Writer 开始之前(beforeWrite),之后(afterWrite)和错误后(onWriteError)触发

SkipListener

在 Skip(reder)时候,在 Skip(writer)时候,在 Skip(processor)时候

 SpringBatch具体小例子(部分代码)
@Configuration
@EnableBatchProcessing
public class CafeCatConfiguration {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private CatProcessor catProcessor;

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Bean
    public Job cafeCatJob() {
        return jobBuilderFactory.get("cafeCatJob")
                .start(cafeCatStep())
                .build();
    }

    @Bean
    public Step cafeCatStep() {
        return stepBuilderFactory.get("cafeCatStep")
                .chunk(10)
                .reader(cafeCatCommonFileItemReader())
                .processor(catProcessor)
                .writer(catCommonMybatisItemWriter())
                .build();
    }

    @Bean
    @StepScope
    public CommonFileItemReader cafeCatCommonFileItemReader() {
        return new CommonFileItemReader<>(CafeCat.class);
    }


    @Bean
    @StepScope
    public CommonMybatisItemWriter catCommonMybatisItemWriter() {
         return new CommonMybatisItemWriter<>(sqlSessionFactory,Cat.class.getSimpleName());
    }
}

详细代码请参考GitHub上面:SpringBatch例子详细代码

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434717.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号