ItemStream
ItemReaders 和 ItemWriters 各自都能很好地发挥作用,但两者都存在一个共同的问题,需要引入另一个接口来解决。通常,作为批处理作业范围的一部分,读取器和写入器需要被打开和关闭,并且需要一种持久化状态的机制。ItemStream 接口正是为此而设计的,如下例所示:
public interface ItemStream {
void open(ExecutionContext executionContext) throws ItemStreamException;
void update(ExecutionContext executionContext) throws ItemStreamException;
void close() throws ItemStreamException;
}
在描述每个方法之前,我们应该提及 ExecutionContext。ItemReader 的客户端如果同时也实现了 ItemStream,则在调用任何 read 之前应先调用 open,以便打开文件等资源或获取连接。类似的限制也适用于实现了 ItemStream 的 ItemWriter。正如第 2 章所述,如果在 ExecutionContext 中找到了预期的数据,则可以使用它来从非初始状态的位置启动 ItemReader 或 ItemWriter。相反,close 被调用的目的是确保在打开期间分配的任何资源都能安全释放。update 主要用于确保当前持有的任何状态都被加载到提供的 ExecutionContext 中。该方法在提交之前被调用,以确保在提交之前将当前状态持久化到数据库中。
在一种特殊情况下,当ItemStream的客户端是Step(来自 Spring Batch Core)时,会为每个 StepExecution 创建一个ExecutionContext,以便用户存储特定执行的状态,并期望在再次启动相同的JobInstance时返回该状态。对于熟悉 Quartz 的用户来说,其语义与 Quartz 的JobDataMap非常相似。