控制回滾
預設情況下,無論是否配置了重試或跳過,從 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
ItemReader
的基本約定是它只能向前讀取。step 會緩衝 reader 的輸入,以便在發生回滾時,無需從 reader 重新讀取專案。然而,在某些場景中,reader 是構建在事務性資源之上的,例如 JMS 佇列。在這種情況下,由於佇列與回滾的事務繫結在一起,從佇列中拉取的訊息會被放回佇列。因此,您可以配置 step 不緩衝這些專案。
-
Java
-
XML
以下示例展示瞭如何在 Java 中建立一個不緩衝專案的 ItemReader
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 中建立一個不緩衝專案的 ItemReader
XML 配置
<step id="step1">
<tasklet>
<chunk reader="itemReader" writer="itemWriter" commit-interval="2"
is-reader-transactional-queue="true"/>
</tasklet>
</step>