控制回滚

默认情况下,无论重试还是跳过,从ItemWriter导致由Step回滚。如果 skip 配置为 前面描述的,从ItemReader不会导致回滚。 但是,在许多情况下,从ItemWriter应该 不会导致回滚,因为尚未执行任何作来使事务无效。 因此,您可以配置Step以及不应 cause rollback.spring-doc.cadn.net.cn

在 Java 中,您可以按如下方式控制回滚:spring-doc.cadn.net.cn

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 中,您可以按如下方式控制回滚:spring-doc.cadn.net.cn

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是 this is forward only。步骤缓冲区 Reader 输入,以便在回滚的情况下不需要重新读取 Item 来自读者。但是,在某些情况下,reader 是建立的 事务资源(如 JMS 队列)的顶部。在这种情况下,由于队列是 绑定到回滚的事务,则从 队列重新打开。因此,您可以将步骤配置为不缓冲 项目。spring-doc.cadn.net.cn

以下示例演示如何在 Java 中创建不缓冲项目的读取器:spring-doc.cadn.net.cn

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 中的项目的读取器:spring-doc.cadn.net.cn

XML 配置
<step id="step1">
    <tasklet>
        <chunk reader="itemReader" writer="itemWriter" commit-interval="2"
               is-reader-transactional-queue="true"/>
    </tasklet>
</step>