將 ItemStream
註冊到 Step
Step 必須在其生命週期的必要點處理 ItemStream
回撥。(有關 ItemStream
介面的更多資訊,請參閱ItemStream)。如果 Step 失敗並可能需要重啟,這一點至關重要,因為 ItemStream
介面是 Step 獲取執行之間持久狀態所需資訊的地方。
如果 ItemReader
、ItemProcessor
或 ItemWriter
本身實現了 ItemStream
介面,它們會自動註冊。任何其他流需要單獨註冊。這通常發生在將間接依賴項(例如委託)注入到 Reader 和 Writer 中的情況下。您可以透過 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
,但它的兩個委託都是。因此,必須將這兩個委託 Writer 顯式註冊為流,以便框架正確處理它們。ItemReader
不需要顯式註冊為流,因為它是 Step
的直接屬性。現在 Step 是可重啟的,並且在發生故障時 Reader 和 Writer 的狀態會正確持久化。