ItemStream
ItemReader 和 ItemWriter 各自用途明確,但兩者之間有一個共同關注點,這使得需要另一個介面。通常,作為批處理作業範圍的一部分,reader 和 writer 需要開啟、關閉,並需要一種機制來持久化狀態。ItemStream 介面正是用於此目的,示例如下
public interface ItemStream {
void open(ExecutionContext executionContext) throws ItemStreamException;
void update(ExecutionContext executionContext) throws ItemStreamException;
void close() throws ItemStreamException;
}
在描述每個方法之前,我們應該提及 ExecutionContext。實現 ItemStream 的 ItemReader 的客戶端應在呼叫 read 之前呼叫 open,以開啟任何資源(例如檔案)或獲取連線。實現 ItemStream 的 ItemWriter 也有類似的限制。正如第 2 章中提到的,如果在 ExecutionContext 中找到了預期資料,它可能會用於從非初始狀態的位置啟動 ItemReader 或 ItemWriter。相反,呼叫 close 是為了確保在 open 期間分配的任何資源被安全釋放。主要呼叫 update
是為了確保當前持有的任何狀態都被載入到提供的 ExecutionContext
中。此方法在提交之前呼叫,以確保在提交之前將當前狀態持久化到資料庫中。
在 ItemStream
的客戶端是 Step
(來自 Spring Batch Core)的特殊情況下,會為每個 StepExecution 建立一個 ExecutionContext
,以允許使用者儲存特定執行的狀態,並期望在再次啟動相同的 JobInstance
時返回該狀態。對於熟悉 Quartz 的人來說,其語義與 Quartz 的 JobDataMap
非常相似。