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
也适用类似的限制。如第二章所述,如果在ExecutionContext
中找到预期的数据,则可以使用它来启动ItemReader
或ItemWriter
,而不是从其初始状态开始。相反,调用close
以确保在open
期间分配的任何资源都能安全地释放。update
主要用于确保任何当前持有的状态都加载到提供的ExecutionContext
中。此方法在提交前调用,以确保在提交前将当前状态持久化到数据库中。
在ItemStream
的客户端是Step
(来自 Spring Batch Core)的特殊情况下,为每个 StepExecution 创建一个ExecutionContext
,允许用户存储特定执行的状态,并期望在再次启动相同的JobInstance
时返回该状态。对于熟悉 Quartz 的人来说,语义与 Quartz 的JobDataMap
非常相似。