使用 Step 註冊 ItemStream

step 必須在其生命週期的必要時間點處理 ItemStream 回呼。(關於 ItemStream 介面的更多資訊,請參閱 ItemStream)。如果 step 失敗且可能需要重新啟動,這點至關重要,因為 ItemStream 介面是 step 從中取得執行之間持久狀態所需資訊的地方。

如果 ItemReaderItemProcessorItemWriter 本身實作了 ItemStream 介面,則這些會自動註冊。任何其他 stream 都需要分開註冊。當間接依賴項(例如委派)被注入讀取器和寫入器時,通常會發生這種情況。您可以透過 stream 元素在 step 上註冊 stream。

  • 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,但其兩個委派都是。因此,必須將兩個委派寫入器明確註冊為 stream,框架才能正確處理它們。ItemReader 不需要明確註冊為 stream,因為它是 Step 的直接屬性。現在 step 是可重新啟動的,並且在發生故障時,讀取器和寫入器的狀態會正確地持久保存。