0

Spring Batchを使用して作成されたレガシーアプリケーションを維持しており、データが失われないように調整する必要があります。さまざまなWebサービス(ステップごとに1つ)から読み取り、リモートデータベースに書き込む必要があります。Webサービスから読み取ったすべてのitenが破棄され(同じアイテムを2回読み取ることができない)、書き込みができないためにデータが失われるため、DBとの接続が切断されると状況が悪化します。

次回ステップの実行時に書き込み操作を再試行するために、1つのステップで既に読み取られたデータを保持するようにSpringBatchをセットアップする必要があります。書き込み操作が正常に終了するまで、同じステップでそれ以上のデータを読み取ることはできません。書き込みができない場合、ステップは読み取りデータを保持し、実行を次のステップに渡す必要があります。しばらくすると、失敗したステップを再度実行する時間になると、別のアイテムを読み取らず、代わりに失敗した書き込み操作を再試行します。 。

バッチアプリケーションは無限ループで実行する必要があり、各ステップは1つの異なるソースからデータを収集する必要があります。失敗した書き込み操作は、他のステップを遅らせないように一時的にスキップする(読み取りデータを保持する)必要がありますが、次に呼び出されたときに書き込み操作から再開する必要があります。

私は公式ドキュメント以外のさまざまなWebソースを調査していますが、SpringBatchは私が出会った中で最も直感的なドキュメントではありません。

これは達成できますか?はいの場合、どのように?

4

2 に答える 2

0

これで問題ないかどうかはわかりませんが、構成についての私の考えは次のとおりです。

障害が発生する可能性のある2つのリモートソースがあるため、システム全体を2つのジョブ(2つのステップではない)で分割しましょう。

JOB A

ステップ1:タスクレットファイルの共有フォルダーを確認します。ファイルが存在する場合は、次の手順に進まないでください。JOBBについて書くとより理解しやすくなります

ステップ2:ファイルへのWebサービスWebサービスから読み取り、共有フォルダー内のフラットファイルに結果を書き込みます。出力にフラットファイルを使用するため、「Webサービスから読み取られたすべてのアイテムが破棄され、書き込みができないためにデータが失われる」という問題を解決します。

このジョブのスケジュールには、Quartzまたは同等のものを使用してください。

JOB B 生成されたファイルの共有フォルダーをポーリングし、ファイル(file.getWhereをジョブパラメーターとして)を使用してジョブランチャーを作成します。春の統合プロジェクトは、このポーリングに役立つ可能性があります。

ステップ1:ファイルから読み取り、リモートdbに書き込み、dbへの書き込みが成功した場合はファイルを移動/削除します。

ジョブの起動はポーリングされたファイルから開始されるため、スケジューリングは必要ありません。

サンプル実行

時間0:共有フォルダにファイルがありません

時間1:Webサービスから読み取り、共有フォルダーに書き込みます

時間2:ジョブBファイルのポーリングが発生し、dbへの書き込みを試みます。

成功した場合、システムは実行を継続します。

そうでない場合、ジョブAがスケジュールされた時間に実行しようとすると、ファイルが共有フォルダーにまだ存在するため、Webサービスからの読み取りをスキップします。ジョブBがファイルを消費するまでスキップします。

実装の詳細には立ち入りたくありませんでしたが、SpringBatchはこれらすべての状況を処理できます。これがお役に立てば幸いです。

于 2012-12-18T16:58:18.627 に答える
0

ジョブがバッチステップのExecutionContextに失敗した場合に備えて、永続化する必要のあるデータを書き込むことができます。このデータを使用して、ジョブを再開できます。

ステップの実行は、StepExecutionクラスのオブジェクトによって表されます。各実行には、対応するステップとJobExecutionへの参照、およびコミットとロールバックのカウント、開始時間と終了時間などのトランザクション関連データが含まれます。さらに、各ステップの実行には、ExecutionContextが含まれます。これには、再起動に必要な統計や状態情報など、開発者がバッチ実行全体で永続化する必要のあるデータが含まれます。

その他の情報:http ://static.springsource.org/spring-batch/reference/html/domain.html#domainStepExecution

于 2012-12-18T16:40:28.903 に答える