javascript
SpringBatch批处理框架入门(二)
这篇文章接上一篇SpringBatch批处理框架入门(一),继续讲解SpringBatch基础知识。
目录
SpringBatch 核心类介绍
SpringBatch 核心类Job
SpringBatch 核心类Step
SpringBatch 核心类StepExecution
SpringBatch 核心类ExecutionContext
SpringBatch 核心类JobRepository
SpringBatch 核心类JobLauncher
SpringBatch 核心类ItemReader和ItemWriter
SpringBatch 核心类ItemProcessor
SpringBatch 核心类Chunk
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的例子代码如下:
@Beanpublic 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 {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;@Autowiredprivate CatProcessor catProcessor;@Autowiredprivate SqlSessionFactory sqlSessionFactory;@Beanpublic Job cafeCatJob() {return jobBuilderFactory.get("cafeCatJob").start(cafeCatStep()).build();}@Beanpublic Step cafeCatStep() {return stepBuilderFactory.get("cafeCatStep").<CafeCat, Cat>chunk(10).reader(cafeCatCommonFileItemReader()).processor(catProcessor).writer(catCommonMybatisItemWriter()).build();}@Bean@StepScopepublic CommonFileItemReader<CafeCat> cafeCatCommonFileItemReader() {return new CommonFileItemReader<>(CafeCat.class);}@Bean@StepScopepublic CommonMybatisItemWriter<Cat> catCommonMybatisItemWriter() {return new CommonMybatisItemWriter<>(sqlSessionFactory,Cat.class.getSimpleName());} }详细代码请参考GitHub上面:SpringBatch例子详细代码
总结
以上是生活随笔为你收集整理的SpringBatch批处理框架入门(二)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: SpringBatch批处理框架入门(一
- 下一篇: SpringBatch接口BatchCo