ItemStream
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
的客户端是一个来自 Spring Batch Core 的 Step
,则会为每个 StepExecution 创建一个 ExecutionContext
,以允许用户存储特定执行的状态,并期望如果启动相同的 JobInstance
时可以恢复该状态。对于熟悉 Quartz 的用户来说,其语义与 Quartz 的 JobDataMap
非常相似。