控制回滚

默认情况下,无论重试或跳过,从 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>