配置跳过逻辑
在许多场景中,处理时遇到的错误不应导致 Step
失败,而应跳过。这通常是一个决定,必须由理解数据本身及其含义的人来做出。例如,财务数据可能无法跳过,因为它涉及到资金转移,需要完全准确。另一方面,加载供应商列表时可能允许跳过。如果某个供应商因格式不正确或缺少必要信息而未加载,可能不会有问题。通常,这些错误记录也会被记录下来,这将在稍后讨论监听器时介绍。
-
Java
-
XML
以下 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。
以下 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。声明的异常(及其子类)可能在 Chunk 处理的任何阶段(读取、处理或写入)抛出。Step 执行内部会分别计算读取、处理和写入阶段的跳过次数,但限制适用于所有跳过。一旦达到跳过限制,遇到的下一个异常将导致 Step 失败。换句话说,是第十一次跳过触发异常,而不是第十次。
上述示例的一个问题是,除了 FlatFileParseException
之外的任何其他异常都会导致 Job
失败。在某些场景下,这可能是正确的行为。然而,在其他场景下,识别哪些异常应该导致失败并跳过所有其他异常可能更容易。
-
Java
-
XML
以下 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。
以下 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
,配置将可跳过异常类的列表细化为除了 FileNotFoundException
之外的所有 Exceptions
。遇到的任何被排除的异常类都是致命的(即,它们不会被跳过)。
对于遇到的任何异常,其可跳过性由类层次结构中最接近的超类决定。任何未分类的异常都被视为“致命”。
-
Java
-
XML
skip
和 noSkip
方法调用的顺序无关紧要。
<include/>
和 <exclude/>
元素的顺序无关紧要。