ItemStream

ItemReaderItemWriter 都很好地服务于各自的目的,但两者之间存在一个共同的问题,需要另一个接口来解决。一般来说,作为批处理作业范围的一部分,读取器和写入器需要打开、关闭,并需要一种持久化状态的机制。ItemStream 接口满足此目的,如下例所示。

public interface ItemStream {

    void open(ExecutionContext executionContext) throws ItemStreamException;

    void update(ExecutionContext executionContext) throws ItemStreamException;

    void close() throws ItemStreamException;
}

在描述每个方法之前,我们应该提到ExecutionContext。作为ItemStreamItemReader 客户端,应该在任何对read 的调用之前调用open,以便打开任何资源(例如文件)或获取连接。对实现ItemStreamItemWriter 也适用类似的限制。如第二章所述,如果在ExecutionContext 中找到预期的数据,则可以使用它来启动ItemReaderItemWriter,而不是从其初始状态开始。相反,调用close 以确保在open 期间分配的任何资源都能安全地释放。update 主要用于确保任何当前持有的状态都加载到提供的ExecutionContext 中。此方法在提交前调用,以确保在提交前将当前状态持久化到数据库中。

ItemStream 的客户端是Step(来自 Spring Batch Core)的特殊情况下,为每个 StepExecution 创建一个ExecutionContext,允许用户存储特定执行的状态,并期望在再次启动相同的JobInstance 时返回该状态。对于熟悉 Quartz 的人来说,语义与 Quartz 的JobDataMap 非常相似。