控制回滾
預設情況下,無論是否重試或跳過,從 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>
事務性 Readers
ItemReader
的基本契約是它僅為前向的。Step 緩衝 reader 輸入,以便在回滾的情況下,項目不需要從 reader 重新讀取。但是,在某些情況下,reader 是建立在事務性資源之上的,例如 JMS 佇列。在這種情況下,由於佇列與回滾的交易相關聯,因此從佇列中提取的訊息會放回佇列中。因此,您可以將 step 配置為不緩衝項目。
-
Java
-
XML
以下範例展示如何在 Java 中建立不緩衝項目的 reader
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 中建立不緩衝項目的 reader
XML 設定
<step id="step1">
<tasklet>
<chunk reader="itemReader" writer="itemWriter" commit-interval="2"
is-reader-transactional-queue="true"/>
</tasklet>
</step>