ItemStream
ItemReaders
和 ItemWriters
都很好地服务于各自的用途,但它们之间有一个共同的问题,需要另一个接口。通常,作为批处理作业范围的一部分,需要打开和关闭读取器和写入器,并且需要一种持久化状态的机制。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
非常相似。