ロールバックの制御
デフォルトでは、再試行またはスキップに関係なく、ItemWriter
から例外がスローされると、Step
によって制御されるトランザクションがロールバックされます。前述のようにスキップが構成されている場合、ItemReader
から例外がスローされてもロールバックは発生しません。ただし、トランザクションを無効にするアクションが実行されていないため、ItemWriter
からスローされた例外によってロールバックが発生しないシナリオが多数あります。このため、ロールバックを引き起こしてはならない例外のリストを使用して Step
を構成できます。
Java
XML
Java では、次のようにロールバックを制御できます。
Java 構成
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("step1", jobRepository)
.<String, String>chunk(2, transactionManager)
.reader(itemReader())
.writer(itemWriter())
.faultTolerant()
.noRollback(ValidationException.class)
.build();
}
XML では、次のようにロールバックを制御できます。
XML 構成
<step id="step1">
<tasklet>
<chunk reader="itemReader" writer="itemWriter" commit-interval="2"/>
<no-rollback-exception-classes>
<include class="org.springframework.batch.item.validator.ValidationException"/>
</no-rollback-exception-classes>
</tasklet>
</step>
トランザクションリーダー
ItemReader
の基本契約は、フォワードのみです。このステップはリーダーの入力をバッファリングするため、ロールバックの場合にアイテムをリーダーから再度読み取る必要はありません。ただし、リーダーが JMS キューなどのトランザクションリソース上に構築される特定のシナリオがあります。この場合、キューはロールバックされるトランザクションに結び付けられているため、キューからプルされたメッセージは戻されます。このため、アイテムをバッファリングしないようにステップを構成できます。
Java
XML
次の例は、Java でアイテムをバッファリングしないリーダーを作成する方法を示しています。
Java 構成
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("step1", jobRepository)
.<String, String>chunk(2, transactionManager)
.reader(itemReader())
.writer(itemWriter())
.readerIsTransactionalQueue()
.build();
}
次の例は、XML でアイテムをバッファリングしないリーダーを作成する方法を示しています。
XML 構成
<step id="step1">
<tasklet>
<chunk reader="itemReader" writer="itemWriter" commit-interval="2"
is-reader-transactional-queue="true"/>
</tasklet>
</step>