4

基本的に、バッチのすべてのステップで除外されたアイテムを含むレポートを作成したいと思います。現在、spring-batch-adminでフィルタリング(およびスキップ)された数を確認できますが、手動で処理できるようにアイテムのリストが必要です。

私のステップでは、クライアントのリストを調べて、サードパーティのソースからクライアントに関するデータを取得します。データの取得に使用するすべてのアカウントにユーザー名とパスワードがあります。クライアントが資格情報を持っていない可能性があります。プロセッサを実行する前に、それらをフィルタリングします。しかし、クライアントが間違ったクレデンシャルを持っている可能性があり(彼はそれらを間違って入力しました)、それから私もそれをフィルタリングしたいのですが、「異なって」。制限を設定したくないので、これらの項目をスキップしたくありません。制限を設定すると、ジョブが失敗します。いずれもヌルや不正解であったとしても、次の段階に進みたいと思います。

私のチャンクは現在、DBリーダー、DBライター、および次の機能で構成されCompositeItemProcessorています。

  • クライアントが資格情報を持っていることを検証し、持っていない人を除外します。
  • データを取得するデータエンハンサー(別のItemProcessor)を実行します。これが不正なクレデンシャルでエラーを受け取った場合、アイテムもフィルタリングします(nullを返します)。

私がやりたいことは:

  • (同じステップで)発生したフィルタリングの2つの「タイプ」を区別します。filterCount現在、spring-batch-adminのフィールドでそれらすべてが合計されているのがわかります。
  • 後で手動で処理するために、ケースごとにフィルタリングされたクライアントとともにレポートを送信します。また、いくつかの手順でフィルタリングされたアイテムを集約し、最後に一緒に送信したいと思います。

最善のアプローチは何でしょうか?ItemProcessorアイテムがフィルタリングされた原因を知ることができますか?ItemListenersアイテムが処理された後に通知されるものがあることを知っていますが、これらを何らかの方法で使用する必要がありますか?ジョブが終了するまで結果(フィルタリングされたアイテム)を保存するにはどうすればよいですか?

彼の仕事が実行された後にレポートを作成しようとしているのは私だけではないと思うので、私はこれに関するベストプラクティスを探しましたが、有用なものは何も見つかりませんでした。

ありがとう!

4

2 に答える 2

4

これに取り組む最善の方法は、ItemProcessor内から例外を発生させ、それらをスキップ例外としてフィルタリングすることです。次に、SkipListenerを使用して、それらを別の出力に書き込みます。詳細メッセージを例外のメッセージに入れて、出力に含めることができるようにします。スキップ制限を999999などの非常に高い値に設定すると、スキップの数が原因でジョブが失敗するのを防ぐことができます。

私はこれをかなりの数のSpring-Batchジョブで非常にうまく実行しましたが、これは珍しいパターンではありません。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-07-12T12:23:58.587 に答える
1

私も同様の状況に直面しており、使用することにしたアプローチはnullオブジェクトパターンに触発されています。nullを返すことで、通常どおり不要なアイテムをフィルタリングします。まだ書きたいアイテムを見つけた場合、別の方法として、null以外のアイテムを返しますが、通常の実行では入力できない特定の状態のアイテムを返します。私の作家がこれを見るとき、それはそれを異なって扱うことを知っています。必要に応じて、null状態は、それを解釈する方法に関する情報をライターに提供するように設計できます。

これにはかなり明らかな欠点がいくつかありますが、最大の利点は、Springのフレームワークの使用の複雑さを最小限に抑えることができることだと思います。

また、プレーンテキストのユーザー名とパスワードのように聞こえるものにアクセスできるという事実は私を心配しています。

于 2013-08-19T14:55:17.710 に答える