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