Step 注册 ItemStream

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

如果ItemReaderItemProcessorItemWriter本身实现了ItemStream接口,则会自动注册它们。任何其他流都需要单独注册。这在将间接依赖项(例如委托)注入读取器和写入器的情况下很常见。您可以通过stream元素在step上注册流。

  • Java

  • XML

以下示例展示了如何在 Java 中在step上注册stream

Java 配置
@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();
}

/**
 * In Spring Batch 4, the CompositeItemWriter implements ItemStream so this isn't
 * necessary, but used for an example.
 */
@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;
}

以下示例展示了如何在 XML 中在step上注册stream

XML 配置
<step id="step1">
    <tasklet>
        <chunk reader="itemReader" writer="compositeWriter" commit-interval="2">
            <streams>
                <stream ref="fileItemWriter1"/>
                <stream ref="fileItemWriter2"/>
            </streams>
        </chunk>
    </tasklet>
</step>

<beans:bean id="compositeWriter"
            class="org.springframework.batch.item.support.CompositeItemWriter">
    <beans:property name="delegates">
        <beans:list>
            <beans:ref bean="fileItemWriter1" />
            <beans:ref bean="fileItemWriter2" />
        </beans:list>
    </beans:property>
</beans:bean>

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