当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2!

配置跳过逻辑

在很多场景下,处理过程中遇到的错误并不一定要导致 Step 失败,而是可以选择跳过。 这种决定通常必须由真正理解数据本身及其业务含义的人来做出。 例如,财务数据通常不适合跳过,因为它关系到资金流转,必须绝对准确。 但加载供应商列表这类任务则可能允许跳过。如果某个供应商记录由于格式不正确或缺少必要信息而没有被导入, 通常不会造成严重问题。一般来说,这些坏记录还会被记录日志,关于这一点后面在介绍监听器时还会再讲。

  • Java

  • XML

下面的 Java 示例展示了如何使用跳过上限:

Java Configuration
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
    int skipLimit = 10;
    var skippableExceptions = Set.of(FlatFileParseException.class);
    SkipPolicy skipPolicy = new LimitCheckingExceptionHierarchySkipPolicy(skippableExceptions, skipLimit);

	return new StepBuilder("step1", jobRepository)
				.<String, String>chunk(10).transactionManager(transactionManager)
				.reader(flatFileItemReader())
				.writer(itemWriter())
				.faultTolerant()
				.skipPolicy(skipPolicy)
				.build();
}

注意:skipLimit 也可以通过 skipLimit() 方法显式设置。

下面的 XML 示例展示了如何使用跳过上限:

XML Configuration
<step id="step1">
   <tasklet>
      <chunk reader="flatFileItemReader" writer="itemWriter"
             commit-interval="10" skip-limit="10">
         <skippable-exception-classes>
            <include class="org.springframework.batch.infrastructure.item.file.FlatFileParseException"/>
         </skippable-exception-classes>
      </chunk>
   </tasklet>
</step>

在前面的示例中,使用的是 FlatFileItemReader。 如果在任何时刻抛出了 FlatFileParseException,该 item 就会被跳过, 并计入总跳过上限 10。所声明的异常(以及它们的子类)可能在块处理的任意阶段抛出, 包括读取、处理和写出。step 执行内部会分别统计读取、处理和写出阶段的跳过次数, 但上限是对所有跳过次数统一生效的。一旦达到跳过上限,下一次出现异常时 step 就会失败。 换句话说,触发异常的是第 11 次跳过,而不是第 10 次。

跳过上限适用于所有跳过场景(读取、处理和写出)。