ItemStream
ItemReader 和 ItemWriter 各自都很好地完成了它們的功能,但它們之間有一個共同的關注點,這需要另一個介面。通常,作為批處理作業範圍的一部分,讀取器和寫入器需要開啟、關閉,並且需要一種持久化狀態的機制。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 非常相似。