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