跳到主要内容

配置跳过逻辑

QWen Plus 中英对照 Configuring Skip Logic

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

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

注意:可以使用 skipLimit() 方法显式设置 skipLimit。如果没有指定,默认的跳过限制将设置为 10。

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

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

下面的 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();
}
java

注意:可以使用 skipLimit() 方法显式设置 skipLimit。如果没有指定,默认的跳过限制将设置为 10。

通过将 java.lang.Exception 标识为可跳过的异常类,配置表明所有 Exception 都是可以跳过的。然而,通过“排除” java.io.FileNotFoundException,配置将可跳过的异常类列表细化为所有 Exception 除外 FileNotFoundException。任何被排除的异常类如果遇到将是致命的(也就是说,它们不会被跳过)。

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

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