設定跳過邏輯
在許多情況下,處理時遇到的錯誤不應導致 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();
}
以下 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 次的跳過限制。在區塊處理的任何階段(讀取、處理或寫入)都可能拋出已宣告的例外(及其子類別)。在步驟執行內部,會分別計算讀取、處理和寫入時的跳過次數,但限制適用於所有跳過。一旦達到跳過限制,下一個找到的例外會導致步驟失敗。換句話說,第十一次跳過會觸發例外,而不是第十次。
前述範例的一個問題是,除了 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();
}
以下 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
skip
和 noSkip
方法呼叫的順序無關緊要。
<include/>
和 <exclude/>
元素的順序無關緊要。