ItemStream

ItemReadersItemWriters 都很好地服务于各自的用途,但它们之间有一个共同的问题,需要另一个接口。通常,作为批处理作业范围的一部分,需要打开和关闭读取器和写入器,并且需要一种持久化状态的机制。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。如第 2 章所述,如果在 ExecutionContext 中找到预期数据,则可以使用它在除其初始状态之外的位置启动 ItemReaderItemWriter。相反,调用 close 以确保在 open 期间分配的任何资源都安全释放。主要调用 update 以确保将当前保存的任何状态加载到提供的 ExecutionContext 中。在提交之前调用此方法,以确保在提交之前将当前状态持久化到数据库中。

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