次の方法で設計できる春のバッチジョブを使用できるユースケースがあります。
1) 最初の方法:
Step1 (チャンク指向のステップ): ファイルから読み込む —> 読み取った行をフィルタリング、検証、および DTO (データ転送オブジェクト) に変換します。エラーがあれば、DTO 自体にエラーを格納します。DTO のいずれかにエラーがあるかどうかを確認し、そうでない場合はデータベースに書き込みます。ある場合は、エラー ファイルに書き込みます。
ただし、この方法の問題は、トランザクション境界でこの JOB 全体が必要なことです。したがって、いずれかのチャンクでエラーが発生した場合、DB に書き込みたくなく、DB のその時点まで成功したすべての書き込みをロールバックしたいと考えています。上記の方法では、いずれかのチャンクでエラーが発生した場合、成功したすべての書き込みに対してロールバック ロジックを作成する必要があります。
2) 第二の方法
ステップ 1 (チャンク指向のステップ): ファイルからアイテムを読み取る —> 読み取った行を DTO (データ転送オブジェクト) でフィルター処理、検証、および変換します。これにより、DTO オブジェクト自体にエラーが格納されます。
ステップ 2 (タスクレット): ステップ 1 で作成された DTO のリスト全体 (チャンクではなく) を読み取ります —> DTO にエラーが入力されているかどうかを確認します。はいの場合、DB への書き込みを中止し、JOB を失敗させます。
2 番目の方法では、チャンク処理とスケーリングのすべての利点を得ることができます。同時に、ジョブ全体のトランザクション境界を作成しました。
PS :どちらの方法でも、最初のステップで失敗があったとしても、ステップの失敗はありません。エラーは DTO オブジェクト自体に格納されます。したがって、DTO オブジェクトは常に作成されます。
質問は-私はSpringバッチが初めてなので、2番目の方法で行くのは良いパターンですか. また、ステップ間でデータを共有して、DTO のリスト全体を 2 番目のステップで使用できるようにする方法はありますか (上記の 2 番目の方法)。