Registering ItemStream
with a Step
-
当一个步骤失败且可能需要重新启动时,ItemStream 接口提供持久状态信息。
-
此外,如果 ItemReader、ItemProcessor 或 ItemWriter 本身未实现 ItemStream,则任何其他流都需要单独注册。可以通过在步骤上指定 stream 元素来实现注册。
步骤必须在其生命周期的必要点照顾`ItemStream`回调。(有关 `ItemStream`接口的更多信息,请参见ItemStream)。如果步骤失败且可能需要重新启动,此步骤至关重要,因为 `ItemStream`接口是步骤获取有关执行之间持久状态所需的信息。
如果 ItemReader
、ItemProcessor
或 ItemWriter
本身实现了 ItemStream
接口,则会自动注册这些内容。需要单独注册任何其他流。这种情况通常发生在将间接依赖项(例如,委托)注入到读取器和写入器中时。可以通过 stream
元素在 step
上注册流。
- Java
-
以下示例展示了如何在 Java 中在
step
上注册stream
:
Java Configuration
@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
-
以下示例展示了如何在 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>
<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
的直接属性。该步骤现在是可重新启动的,并且在发生故障时将正确持久化读取器和写入器状态。