配置跳過邏輯

在許多場景中,處理時遇到的錯誤不應導致 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();
}

注意:可以使用 skipLimit() 方法顯式設定 skipLimit。如果未指定,預設跳過限制設定為 10。

以下 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。宣告的異常(及其子類)可能在 Chunk 處理的任何階段(讀取、處理或寫入)丟擲。Step 執行內部會分別計算讀取、處理和寫入階段的跳過次數,但限制適用於所有跳過。一旦達到跳過限制,遇到的下一個異常將導致 Step 失敗。換句話說,是第十一次跳過觸發異常,而不是第十次。

上述示例的一個問題是,除了 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();
}

注意:可以使用 skipLimit() 方法顯式設定 skipLimit。如果未指定,預設跳過限制設定為 10。

以下 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,配置將可跳過異常類的列表細化為除了 FileNotFoundException 之外的所有 Exceptions。遇到的任何被排除的異常類都是致命的(即,它們不會被跳過)。

對於遇到的任何異常,其可跳過性由類層次結構中最接近的超類決定。任何未分類的異常都被視為“致命”。

  • Java

  • XML

skipnoSkip 方法呼叫的順序無關緊要。

<include/><exclude/> 元素的順序無關緊要。