2017-06-17 5 views
0

ステップが始まる前と完了する前にデータベースを更新する必要があります。目的は、一度に実行されているプロセスをデータベース内で追跡することです。ステップが実行される前に、レコードが挿入されます。ステップが完了すると、レコードが削除されます。エレガントではありませんが、それは私の必要条件です。Spring Batchでは、beforeStepの実装でデータを挿入できます

私は、これをStepExecutionListenerとして実装し、beforeStepとafterStepでinsert文とdelete文を発行することを考えました。これにより、ジョブに対して定義されたデータソースを活用することもできます。

このアプローチの欠点がある場合はどうなりますか?この問題をよりよく解決するフレームワークのフックがありますか?

答えて

0

一般的に、あなたが説明するものは可能でなければなりません。 beforeStepとafterStepは "通常の"トランザクション処理の外にあるので、あなたが気づかなければならないのはトランザクション制御だけです。 (ここでは詳細 https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-1-the-basics/でトランザクション処理を説明する3つの良いポストは、https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-3-skip-and-retry/https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-2-restart-cursor-based-reading-and-listeners/、ある)

あなたが代わりビフォア/ AfterStepのリスナーを使用しての(簡単なタスクレット・ステップとして実装)別々のステップを使用することができます。ステップ1はdbにエントリを挿入するか、例外をスローします。これにより、バッチが失敗するか、フロー定義に応じて終了します(フロー定義に依存します)。ステップ2は通常のロジックを実行し、ステップ3はステップ1で挿入したエントリを削除します。

私が理解していないのは、実際にdbにエントリを書き込んで、それが利用可能かどうかを確認する必要があるからです。単純な選択では十分ではないでしょうか?

もし私がそれをしなければならない場合、私はあなたに2つのステップ、単純な選択を実行することによって可用性をチェックし、2つ目のステップは通常のロジックを実行するという2つのステップで要件を実装します。

+0

ありがとうご入力いただきありがとうございます。 beforeStep中にレコードを挿入することは、データベースが使用可能かどうかを検証するのではなく、状態管理に関するものです。 –

0

あなたは正しいですか?StepExecutionListenerを実装する必要があります。私はこのアプローチには欠点がないと思います。または、2つの異なるタスクレットを挿入用に追加し、1つを削除用に追加することができます。

関連する問題