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