对于最新稳定版本,请使用 Spring Batch 文档 6.0.3spring-doc.cadn.net.cn

配置跳过逻辑

在许多场景中,处理过程中遇到的错误不应导致 Step 失败,而应被跳过。这通常必须由理解数据本身及其含义的人员来决定。例如,财务数据可能不可跳过,因为它涉及资金转账,必须完全准确。另一方面,加载提供商列表时可能允许跳过。如果某个提供商因格式不正确或缺少必要信息而未能加载,通常不会造成问题。通常,这些不良记录也会被记录日志,这一点将在后续讨论监听器时涵盖。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(10, transactionManager)
				.reader(flatFileItemReader())
				.writer(itemWriter())
				.faultTolerant()
				.skipLimit(10)
				.skip(FlatFileParseException.class)
				.build();
}

注意:skipLimit 可以使用 skipLimit() 方法显式设置。如果未指定,默认的跳过限制为 10。spring-doc.cadn.net.cn

以下 XML 示例展示了如何使用跳过限制:spring-doc.cadn.net.cn

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

在前面的示例中,使用了 FlatFileItemReader。如果在任何时刻抛出 FlatFileParseException,则跳过该项并将其计入总共 10 次的跳过限制中。声明可能抛出的异常(及其子类)可能在块处理的任何阶段(读取、处理或写入)发生。在步骤执行期间,会分别统计读取、处理和写入阶段的跳过次数,但该限制适用于所有跳过操作的总和。一旦达到跳过限制,下一个发现的异常将导致步骤失败。换句话说,是第十一次跳过触发异常,而不是第十次。spring-doc.cadn.net.cn

前述示例的一个问题是,除了 FlatFileParseException 之外的任何异常都会导致 Job 失败。在某些场景下,这可能是正确的行为。然而,在其他场景下,可能更容易识别哪些异常应导致失败,而跳过其余所有异常。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(10, transactionManager)
				.reader(flatFileItemReader())
				.writer(itemWriter())
				.faultTolerant()
				.skipLimit(10)
				.skip(Exception.class)
				.noSkip(FileNotFoundException.class)
				.build();
}

注意:skipLimit 可以使用 skipLimit() 方法显式设置。如果未指定,默认的跳过限制为 10。spring-doc.cadn.net.cn

以下 XML 示例展示了排除特定异常的用法:spring-doc.cadn.net.cn

XML 配置
<step id="step1">
    <tasklet>
        <chunk reader="flatFileItemReader" writer="itemWriter"
               commit-interval="10" skip-limit="10">
            <skippable-exception-classes>
                <include class="java.lang.Exception"/>
                <exclude class="java.io.FileNotFoundException"/>
            </skippable-exception-classes>
        </chunk>
    </tasklet>
</step>

通过将 java.lang.Exception 标识为可跳过的异常类,该配置表明所有 Exceptions 都是可跳过的。然而,通过“排除”java.io.FileNotFoundException,该配置将可跳过的异常类列表细化为所有 Exceptions但不包括 FileNotFoundException。任何被排除的异常类在遇到时都将视为致命错误(即不会被跳过)。spring-doc.cadn.net.cn

对于遇到的任何异常,其可跳过性由类层次结构中最近的父类决定。任何未分类的异常都被视为“致命”。spring-doc.cadn.net.cn

skipnoSkip 方法调用的顺序无关紧要。spring-doc.cadn.net.cn

<include/><exclude/> 元素的顺序无关紧要。spring-doc.cadn.net.cn