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 非常相似。