スキップロジックの構成

処理中に発生したエラーが 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 に対してカウントされます。宣言された例外 (およびそのサブクラス) は、チャンク処理 (読み取り、プロセス、書きます)。ステップ実行内での読み取り、処理、書き込みのスキップは個別にカウントされますが、制限はすべてのスキップに適用されます。スキップ制限に達すると、次に見つかった例外によってステップが失敗します。つまり、10 回目ではなく、11 回目のスキップで例外がトリガーされます。

前の例の 1 つの問題は、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 を「除外」することにより、構成はスキップ可能な例外クラスのリストを絞り込み、FileNotFoundException を除くすべての Exceptions にします。除外された例外クラスは、発生すると致命的です (つまり、スキップされません)。

例外が発生した場合、スキップ可能性はクラス階層内の最も近いスーパークラスによって決定されます。未分類の例外はすべて「致命的」として扱われます。

  • Java

  • XML

skip および noSkip メソッド呼び出しの順序は重要ではありません。

<include/> および <exclude/> エレメントの順序は重要ではありません。