|
当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2! |
ItemStream
ItemReader 和 ItemWriter 都能很好地完成各自职责,但它们之间还存在一个共同关注点,因此需要另一个接口。
一般来说,在批处理 job 的执行范围内,reader 和 writer 都需要被打开、关闭,并且需要一种持久化状态的机制。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 非常相似。