这篇文章接上一篇SpringBatch批处理框架入门(一),继续讲解SpringBatch基础知识。
SpringBatch 核心类介绍
下图是我们要讲解spring batch几个核心类:
SpringBatch 核心类JobJob是封装整个批处理过程的一个概念。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 核心类StepExecutionStepExecution表示一次执行Step, 每次运行一个Step时都会创建一个新的StepExecution,类似于JobExecution。 但是,某个步骤可能由于其之前的步骤失败而无法执行。 且仅当Step实际启动时才会创建StepExecution。
一次step执行的实例由StepExecution类的对象表示。 每个StepExecution都包含对其相应步骤的引用以及JobExecution和事务相关的数据,例如提交和回滚计数以及开始和结束时间。 此外,每个步骤执行都包含一个ExecutionContext,其中包含开发人员需要在批处理运行中保留的任何数据,例如重新启动所需的统计信息或状态信息。
下面是一个从数据库当中截图的实例:
SpringBatch 核心类ExecutionContextExecutionContext即每一个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)时候 |
@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例子详细代码



