跳到主要内容

控制回滚

QWen Plus 中英对照 Controlling Rollback

默认情况下,无论是否重试或跳过,ItemWriter 抛出的任何异常都会导致 Step 控制的事务回滚。如果按照前面描述的方式配置了跳过,则 ItemReader 抛出的异常不会导致回滚。然而,在许多情况下,ItemWriter 抛出的异常不应该导致回滚,因为没有发生任何使事务无效的操作。因此,您可以配置 Step 的一个异常列表,这些异常不会导致回滚。

在 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();
}
java

事务型读取者

ItemReader 的基本契约是它只能向前读取。步骤会缓冲读者的输入,这样在回滚的情况下,项不需要从读者那里重新读取。然而,在某些情况下,读者是建立在事务性资源之上的,例如 JMS 队列。在这种情况下,由于队列与被回滚的事务相关联,从队列中提取的消息会被重新放回队列。因此,您可以配置该步骤以不缓冲这些项。

下面的示例展示了如何在 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();
}
java