|
对于最新稳定版本,请使用 Spring Batch 文档 6.0.3! |
控制回滚
默认情况下,无论是否配置了重试或跳过策略,从 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>