配置跳过逻辑

在处理过程中遇到错误时,有许多情况下不应该导致Step失败,而应该跳过。这通常是由了解数据本身及其含义的人做出的决定。例如,财务数据可能不可跳过,因为它会导致资金转移,而资金转移需要完全准确。另一方面,加载供应商列表可能会允许跳过。如果供应商未加载,因为它格式不正确或缺少必要信息,则可能没有问题。通常,这些错误记录也会被记录下来,稍后在讨论侦听器时会介绍。

  • Java

  • XML

以下 Java 示例展示了使用跳过限制的一个示例

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

以下 XML 示例展示了使用跳过限制的一个示例

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 的总跳过限制。在块处理的任何阶段(读取、处理或写入)期间,都可能抛出声明的异常(及其子类)。在步骤执行内部对读取、处理和写入的跳过进行单独计数,但限制适用于所有跳过。一旦达到跳过限制,则找到的下一个异常会导致步骤失败。换句话说,第 11 次跳过触发异常,而不是第 10 次。

前一个示例的一个问题是,除了 FlatFileParseException 之外的任何其他异常都会导致 Job 失败。在某些情况下,这可能是正确的行为。但是,在其他情况下,识别哪些异常应导致失败并跳过其他所有异常可能更容易。

  • Java

  • XML

以下 Java 示例展示了排除特定异常的一个示例

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

以下 XML 示例展示了排除特定异常的一个示例

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。如果遇到任何排除的异常类,则该异常类都是致命的(即,它们不会被跳过)。

对于遇到的任何异常,可跳过性由类层次结构中最近的超类确定。任何未分类的异常都被视为“致命”。

  • Java

  • XML

skipnoSkip 方法调用的顺序无关紧要。

<include/><exclude/> 元素的顺序无关紧要。