設定跳過邏輯

在許多情況下,處理時遇到的錯誤不應導致 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 次的跳過限制。在區塊處理的任何階段(讀取、處理或寫入)都可能拋出已宣告的例外(及其子類別)。在步驟執行內部,會分別計算讀取、處理和寫入時的跳過次數,但限制適用於所有跳過。一旦達到跳過限制,下一個找到的例外會導致步驟失敗。換句話說,第十一次跳過會觸發例外,而不是第十次。

前述範例的一個問題是,除了 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/> 元素的順序無關緊要。