ItemStream を Step に登録する

ステップは、ライフサイクルの必要な時点で ItemStream コールバックを処理する必要があります。(ItemStream インターフェースの詳細については、ItemStream を参照してください)。これは、ステップが失敗し、再起動が必要になる可能性がある場合に重要です。なぜなら、ItemStream インターフェースは、ステップが実行間の永続的な状態に関して必要な情報を取得する場所です。

ItemReaderItemProcessor、または ItemWriter 自体が 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;
}

次の例は、stream を step に XML で登録する方法を示しています。

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 の直接のプロパティであるため、ストリームとして明示的に登録する必要はありません。ステップは再開可能になり、障害が発生した場合でもリーダーとライターの状態が正しく保持されます。