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