レコード・スキップ処理
トランザクションのバッチ・ジョブでレコードの読み取りエラーおよび書き込みエラーをスキップするには、レコード・スキップ処理を使用します。 レコード・スキップ・ポリシーは xJCL で指定します。
レコード・スキップ処理
それぞれのバッチ・データ・ストリームに、その独自のレコード・スキップ・ポリシー構成があります。 レコード・スキップ処理を有効にするには、xJCL で com.ibm.batch.bds.skip.count バッチ・データ・ストリーム・プロパティーにゼロ以外の値を指定します。
どのようなレコード・エラーをスキップするのかを指定する com.ibm.batch.bds.skip.include.exception.class.<n> プロパティーや、どのようなレコード・エラーをスキップしないのかを指定する com.ibm.batch.bds.skip.exclude.exception.class.<n> プロパティーを使用することで、レコード・スキップ処理の詳細を指定できます。 この 2 つのプロパティーは互いに排他的です。
バッチ・フレームワークは、ローカルのジョブ状況データベースでステップごとにレコード・スキップ処理を追跡します。 この追跡は、バッチ・フレームワークのバッチ・データ・ストリームについてのみ行われます。 ステップ処理の終わりに、ジョブ・ログにメッセージが書き込まれます。 このメッセージでは、バッチ・データ・ストリームごとのスキップしたレコード数と、 バッチ・データ・ストリームごとの 1 秒当たりのレコード数を示します。1 秒当たりのレコード数は、 バッチ・データ・ストリームが処理したレコード数と一致しないことがあります。 処理された実際数のレコードでかかった時間が 1 秒未満の場合、 1 秒当たりのレコード数の値は、実際数のレコードの処理にかかった時間から推定されます。
以下に、レコード・スキップの各プロパティーと説明をリストします。
- com.ibm.batch.bds.skip.count
レコードの読み取りまたは書き込みでエラーが発生した場合にバッチ・データ・ストリームがスキップできるレコードの数を指定します。 この限界数に達すると、バッチ・データ・ストリームは、読み取りエラーまたは書き込みエラーをそれ以上スキップしません。
入力レコードがスキップされた場合、バッチ・データ・ストリームは次のレコードに移り、それを取り出します。 レコードが正常に読み取られるか、レコードのスキップを伴わないエラーが発生するか、スキップの限界数に達するまで、呼び出し元に制御権は戻りません。
出力レコードがスキップされた場合、バッチ・データ・ストリームは通常どおり呼び出し元に戻ります。
スキップ限界数に達した後にバッチ・データ・ストリームで読み取りエラーまたは書き込みエラーが発生した場合は、読み取り例外または書き込み例外が呼び出し元に返されます。 そのレコードはスキップされません。
バッチ・データ・ストリームにスキップ・リスナーを登録すると、そのスキップ・リスナーはレコードがスキップされるたびに制御権を受け取ります。 読み取りのスキップの場合は、SkipListener.onSkippedRead(Throwable t) メソッドが呼び出されます。 スキップ・リスナーは、次のレコードが取り出される前に制御権を受け取ります。 書き込みのスキップの場合は、SkipListener.onSkippedWrite(Object record, Throwable t) メソッドが呼び出されます。 スキップされたレコードは、1 つ目の引数で渡されます。 スキップ・リスナーは、バッチ・データ・ストリームが呼び出し元に戻る前に制御権を受け取ります。
バッチ・データ・ストリームでのスキップ回数を数える動作は、チェックポイントごとに継続されます。 ジョブ・ステップが再び開始すると、最後にコミットしたチェックポイントからスキップ・カウントがリストアされます。
レコード・スキップ処理はデフォルトでは無効になっています。
com.ibm.websphere.batch.devframework.datastreams.bdsadapter.AbstractBatchDataInputStreamRecordMetrics クラスまたは com.ibm.websphere.batch.devframework.datastreams.bdsadapter.AbstractBatchDataOutputStreamRecordMetrics クラスを拡張するすべてのバッチ・データ・ストリーム実装は、レコード・スキップのサポートを自動的に継承します。 com.ibm.websphere.batch.devframework.datastreams パッケージの下に定義されているすべてのバッチ・データ・ストリームには、レコード・スキップのサポートが含まれています。
- com.ibm.batch.bds.skip.include.exception.class.<n>
レコードの読み取り時または書き込み時にバッチ・データ・ストリームがスキップする例外のリストを指定します。 バッチ・データ・ストリームは、リストにある例外のみをスキップします。
変数 <n> は整数です。 この変数は 1 から開始し、例外ごとに 1 ずつ増分してください。
例外を指定しなかった場合は、デフォルトとして、スキップする読み取り/書き込みエラーのリストにすべての例外が組み込まれます。
このプロパティーの使用例を以下に示します。
<batch-data-streams> <bds> <logical-name>inputBDS</logical-name> <props> <prop name="PATTERN_IMPL_CLASS" value="com.ibm.ws.batch.sample.bds.WCGSampleBDS"/> <prop name="file.encoding" value="8859_1"/> <prop name="FILENAME" value="/tmp/input.txt" /> <prop name="com.ibm.batch.bds.skip.count" value="5" /> <prop name="com.ibm.batch.bds.skip.include.exception.class.1" value="java.io.IOException" /> <prop name="com.ibm.batch.bds.skip.include.exception.class.2" value="com.xyz.bds.error.BadDataException" /> </props> <impl-class>com.ibm.websphere.batch.devframework.datastreams.patterns.TextFileReader</impl-class> </bds> </batch-data-streams>
バッチ・データ・ストリームは、入出力例外および不良データ例外の場合にレコードをスキップします。
- com.ibm.batch.bds.skip.exclude.exception.class.<n>
レコードの読み取り時または書き込み時にスキップできない例外のリストを指定します。
変数 <n> は整数です。 この変数は 1 から開始し、例外ごとに 1 ずつ増分してください。
例外を指定しなかった場合は、デフォルトとして、スキップするレコード読み取り/書き込みエラーのリストからどのレコードも除外されません。
このプロパティーの使用例を以下に示します。
<batch-data-streams> <bds> <logical-name>inputBDS</logical-name> <props> <prop name="PATTERN_IMPL_CLASS" value="com.ibm.ws.batch.sample.bds.WCGSampleBDS"/> <prop name="file.encoding" value="8859_1"/> <prop name="FILENAME" value="/tmp/input.txt" /> <prop name="com.ibm.batch.bds.skip.count" value="3" /> <prop name="com.ibm.batch.bds.skip.exclude.exception.class.1" value="java.io.FileNotFoundException" /> </props> <impl-class>com.ibm.websphere.batch.devframework.datastreams.patterns.TextFileReader</impl-class> </bds> </batch-data-streams>
バッチ・データ・ストリームは、ファイル未検出例外の場合にレコードをスキップしません。
スキップ・リスナー
バッチ・データ・ストリームにスキップ・リスナーを登録して、レコードのスキップを listen することができます。 スキップ・リスナーは、レコードがスキップされるたびに制御権を受け取ります。
AbstractBatchDataInputStream _inputBDS = (AbstractBatchDataInputStream)BatchDataStreamMgr.getBatchDataStream("inputBDS", getJobStepID());
((AbstractBatchDataStreamRecordMetrics)_inputBDS).addSkipListener(new MySkipListener());