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的客户端为Step(来自Spring Batch Core)的特殊情况下,系统会为每个StepExecution创建一个ExecutionContext,允许用户存储特定执行的状态,并期望在相同的JobInstance再次启动时恢复该状态。对于熟悉Quartz的用户来说,其语义与Quartz的JobDataMap非常相似。