当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2!

Step 注册 ItemStream

step 必须在其生命周期中的适当时机处理 ItemStream 的回调。 (关于 ItemStream 接口的更多信息,可参见 ItemStream。) 这一点在 step 失败且可能需要重启时尤为重要,因为 step 正是通过 ItemStream 接口, 获取各次执行之间持久化状态的相关信息。

如果 ItemReaderItemProcessorItemWriter 本身实现了 ItemStream 接口, 那么它们会被自动注册。其他 stream 则需要单独注册。这种情况常见于 reader 或 writer 中注入了间接依赖, 例如 delegate。你可以通过 stream 元素把一个 stream 注册到 step 上。

  • Java

  • XML

下面的示例展示了如何在 Java 中为 step 注册 stream

Java Configuration
@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

XML Configuration
<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, 但它的两个 delegate 都是。因此,这两个 delegate writer 必须显式注册为 stream, 框架才能正确处理它们。ItemReader 则不需要显式注册为 stream, 因为它是 Step 的直接属性。完成这些配置后,该 step 就具备了重启能力, 并且在发生失败时,reader 和 writer 的状态也能够被正确持久化。