向 Step 注册 ItemStream
ItemStream with a Step
步骤必须在生命周期的必要节点处理 ItemStream 回调。(有关 ItemStream 接口的更多信息,请参阅 ItemStream)。这在步骤执行失败且可能需要重启时至关重要,因为 ItemStream 接口是步骤获取跨执行持久状态信息的来源。
如果 ItemReader、ItemProcessor 或 ItemWriter 本身实现了 ItemStream 接口,它们会自动注册。其他任何流都需要单独注册。这种情况常见于间接依赖(例如委托)被注入到读取器和写入器时。你可以通过 stream 元素在 step 上注册一个流。
- Java
- XML
以下示例展示了如何在 Java 中为 step 注册一个 stream:
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("step1", jobRepository)
.<String, String>chunk(2).transactionManager(transactionManager)
.reader(itemReader())
.writer(compositeItemWriter())
.stream(fileItemWriter1())
.stream(fileItemWriter2())
.build();
}
以下示例展示了如何在 XML 中为 step 注册一个 stream:
<step id="step1">
<tasklet>
<chunk reader="itemReader" writer="compositeWriter" commit-interval="2">
<streams>
<stream ref="fileItemWriter1"/>
<stream ref="fileItemWriter2"/>
</streams>
</chunk>
</tasklet>
</step>
在前面的示例中,CompositeItemWriter 本身并非 ItemStream,但其两个委托写入器都是。因此,必须将这两个委托写入器显式注册为流,以便框架能正确处理它们。ItemReader 不需要显式注册为流,因为它是 Step 的直接属性。现在该步骤是可重启的,并且在发生故障时,读取器和写入器的状态会被正确持久化。