2016-06-22 3 views
1

私の特定のシナリオでは、ファイルからデータベースに読み込んだ巨大なエンティティを保持する必要がありますが、コミット間隔はvalue = 1で構成されています。また、CompositeItemProcessorのデリゲートプロセッサーが冪等であるかどうかは私には分かりません。だから私の質問は、再処理に無駄な時間を避け、dbへの未使用のクエリをたくさん避ける方法があるかどうかです。また、SkipListenerを使用して特定のテーブルへの読み込み/処理/書き込みのエラーをログに記録し、そのような構成(再処理なし)がそれに準拠していないと思われます。スキップが発生したときに同じチャンク/アイテムの二重処理からバッチを防止する方法はありますか?

私は春のバッチ2.1.9を使用しています。

ありがとうございます。私は一部のユーザーと春の開発者の間の概念的な議論があり実現した研究の数日後

____________________________ UPDATE 2016年7月5日 ____________________________

ItemWriter#write方法は、項目のリストを受け取ります

私は今、この2014 postでの回答にコメントで@MichaelMinellaで言ったように書き込みフェーズ中にスロースキップされた例外に設計されたとして、この行動中華鍋ということを知っています。一度に1つずつ を実行しないと、リスト内のどの がライターに例外を投げたのかを判断する方法はありません。

だから、まだ方法はありませんフレームワークにリスト全体をスキャンせずに失敗したアイテムを発見(チャンクサイズであっても)。これを行うためのフレームワークの内部動作は FaultTolerantChunkProcessorを使用し、 RetryTemplatethis 2013 postで説明されています。この問題についての詳細は、 spring batch forum 2012 postを参照してください。

答えて

0

チャンクサイズが1に等しい場合、アイテムは複数回処理されるべきではありません。スキップが発生すると、スプリングバッチはチャンク内のスキップされたアイテムを削除し、再処理します。チャンクが1つの要素しか含んでいない場合、複数回処理された要素は存在しないはずです。

+0

私はこの動作も期待していましたが、実際にはフレームワークは読み取りにキャッシュされたリストを常に再処理し、各アイテムのミニチャンクを処理して、 1つの要素。私が知りたいのは、この動作を無効にするか、この高価な再試行をスキップするようにバッチを構成する方法です。もし私がSkipCheckListenerを使ってエラーを処理に登録したいのであれば、これは不可能かもしれません。 – guilhermerama

関連する問題