跳到主要内容

Step 中注册 ItemStream

QWen Plus 中英对照 Registering ItemStream with a Step Registering ItemStream with a Step

该步骤必须在其生命周期的必要阶段处理 ItemStream 回调。 (有关 ItemStream 接口的更多信息,请参见 ItemStream)。 如果一个步骤失败并且可能需要重新启动,这是至关重要的,因为 ItemStream 接口是步骤获取其在执行之间所需的状态持久化信息的地方。

如果 ItemReaderItemProcessorItemWriter 本身实现了 ItemStream 接口,则它们会自动注册。其他任何流需要单独注册。当存在间接依赖项(例如委托)被注入到读取器和写入器中时,通常会出现这种情况。您可以通过 stream 元素在 step 上注册一个流。

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

@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("step1", jobRepository)
.<String, String>chunk(2, transactionManager)
.reader(itemReader())
.writer(compositeItemWriter())
.stream(fileItemWriter1())
.stream(fileItemWriter2())
.build();
}

/**
* 在 Spring Batch 4 中,CompositeItemWriter 实现了 ItemStream,因此这并不是必需的,
* 但这里作为示例使用。
*/
@Bean
public CompositeItemWriter compositeItemWriter() {
List<ItemWriter> writers = new ArrayList<>(2);
writers.add(fileItemWriter1());
writers.add(fileItemWriter2());

CompositeItemWriter itemWriter = new CompositeItemWriter();

itemWriter.setDelegates(writers);

return itemWriter;
}
java

在前面的例子中,CompositeItemWriter 不是 ItemStream,但它的两个委托都是。因此,两个委托 writer 必须明确注册为流,以便框架能够正确处理它们。ItemReader 不需要明确注册为流,因为它 是 Step 的直接属性。现在该步骤可重新启动,并且在发生故障时,读取器和写入器的状态会正确持久化。