1

(JpaPagingItemReaderを使用して)ソーステーブルから読み取り、ItemProcessorに渡しています。私の要件は、アイテムが正常に処理された場合はTABLE_Aに書き込み、処理が失敗した場合はTABLE_Bに書き込む必要があります。私はそれを機能させました、しかし私はそれを良い方法として感じません。私の現在の実装は

// my processor
public class MyItemProcessor implements ItemProcessor<SourceEntity, BaseOutputEntity>{

    @Override
    public BaseOutputEntity process(SourceEntity input) {
       // NOTE: EntityA, EntityB both extend BaseOutputEntity
       try {
           EntityA a = callMyBusiness.method(input);
           return a;
       } catch (MyBusinessException e) {
           EntityB b = createMyFailureObj(input)
           return b;
       }
   }
}

// my itemwriter
public class MyItemWriter extends JpaItemWriter<MyBaseOutputEntity> {
    // donthing as JpaItemWriter methods will take care
}

それは私がまさに望んでいることを機能的に行っています。上記の欠点の1つは、ジョブの実行/ステップの実行履歴を見ると、成功した数や失敗した数がわからないことです。たとえば、100回の読み取りと100回の書き込みの場合などです。

誰もがより良いアプローチを提案できますか?ここで条件付きの手順は役に立ちますか?

4

1 に答える 1

2

プロセッサで例外をスローし、この例外をスキップ可能として宣言できます(そうでない場合、チャンクは壊れます)。

ItemProcessListenerを実装すると、onProcessError(Entry item、Exception t)関数で無効なアイテムをキャッチし、テーブルBに書き込むことができます(ドキュメントを注意深く読んでください:一部のリスナー関数はトランザクション上にあり、その他はトランザクション上にありません)

バッチの最後で、writedItemsCountは有効なアイテムの数であり、skipedItemCountは無効なアイテムの数です。

別のテーブルに書き込む別の方法は、BackToBackPatternClassifierでClassifierCompositeItemWriterを使用することですが、無効なアイテムの数が減ります。

于 2013-02-12T16:47:53.157 に答える