ItemStream
を Step
に登録する
ステップは、ライフサイクルの必要な時点で ItemStream
コールバックを処理する必要があります。(ItemStream
インターフェースの詳細については、ItemStream を参照してください)。これは、ステップが失敗し、再起動が必要になる可能性がある場合に重要です。なぜなら、ItemStream
インターフェースは、ステップが実行間の永続的な状態に関して必要な情報を取得する場所です。
ItemReader
、ItemProcessor
、または 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
の直接のプロパティであるため、ストリームとして明示的に登録する必要はありません。ステップは再開可能になり、障害が発生した場合でもリーダーとライターの状態が正しく保持されます。