Spring Batch的2種STEP定義方式
1. 第一種:基于Chunk-Oriented Processing(read,process,write)形式
適用場景:
- 大數據量批處理:適合需要分批次讀取、處理并寫入大量數據的場景(如數據庫批量更新、文件導入導出)
- 事務敏感操作:每個Chunk(數據塊)作為一個獨立事務提交,避免長事務導致的資源鎖(如數據庫鎖表)
- 數據流水線處理:需對數據逐條轉換、過濾或聚合的場景(如ETL任務)
核心特點:
- 分塊處理:通過
chunkSize
控制單次處理的數據量(例如每次讀取100條),平衡內存與性能 - 代碼量較tasklet重:開發者需實現
ItemReader
ItemProcessor
ItemWriter
接口,且STEP上下文需用到StepExecutionListener
接口;自定義實現類。
@Bean
public Step print1Step(){return stepBuilderFactory.get("updateProductStockQuantityStep").listener(step1StepListener)//步驟監聽.<Product, Product>chunk(10)//每批處理數量.reader(step1ItemReader)//讀.processor(step1Processor)//處理.writer(step1Writer)//寫.build();
}
2. 第二種:基于tasklet形式
適用場景:
- 非數據驅動任務:適合不需要分塊處理的原子性操作,如初始化、清理或調用外部服務
- 靈活控制邏輯:需自定義執行流程(如條件分支、循環)的場景
- 單一事務需求:整個Step在一個事務中完成,適合不可拆分的操作(如文件壓縮、發送通知)
核心特點:
- 簡單接口:僅需實現
execute()
方法,返回RepeatStatus.FINISHED
或CONTINUABLE
支持循環執行) - 全事務控制:整個Tasklet作為單一事務,要么完全成功要么完全回滾
- 無數據分塊:不涉及
ItemReader/Processor/Writer
,適合非結構化任務
@Bean(name = {"printOverStep"})
public Step printOverStep(){return stepBuilderFactory.get("step3").tasklet((contribution, chunkContext) -> {...//業務邏輯return RepeatStatus.FINISHED;}).build();
}
RepeatStatus
返回類型有
- CONTINUABLE:表示當前任務尚未完成,需要繼續執行下一次迭代(例如處理下一個數據塊)
- FINISHED:表示當前任務已執行完畢,終止后續迭代,執行下一個STEP
簡單來說:需要繼續干活就
CONTINUABLE
,干完了就FINISHED
。