配置跳過邏輯
在許多場景中,處理時遇到的錯誤不應導致 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/>
元素的順序無關緊要。