2017-03-10 6 views
0

私は、JavaベースのスプリングブートWebアプリケーションで非常に長いプロセスを実行する必要があります。このプロセスは、以下の手順で構成されます。JavaベースのWebアプリケーションで非常に長いプロセスを実行するには?

  1. データベースから約300,000人のユーザーの詳細を取得します。
  2. 繰り返します。
  3. itextを使用する各ユーザーのPDFファイルを生成します。
  4. PDFファイルをファイルシステムに保存します。
  5. 指定されたユーザーのPDFファイルが作成されたことをデータベースで更新します。
  6. データベース内のユーザーのPDFパスを更新します。

このプロセス全体には多くの時間がかかります。各ユーザーのためにpdfファイルを作成し、次にたくさんのdbを更新することからなるので、何時間もかかるかもしれませんし、日でもあります。

また、このプロセスをバックグラウンドで実行すると、残りのWebアプリケーションを円滑に実行できるようになります。

私はSpring BatchまたはMessaging Queueを使用することを考えています。そのような問題のための適切なフレームワークであるか、またはこれらの2つのうちのどれが問題に最も適しているかは不明です。

このような種類のタスクを実装する理想的な方法は何ですか?

+0

何らかのタイプのスケジューリングが必要ですか? –

+0

@Rodrigo Villalba Zayasスケジューリング?あんまり。 Webアプリケーションでは、UIにプロセスの開始を示すボタンがあり、プロセスが開始されます。 – ashishjmeshram

答えて

0

あなたは、フレームワーク/ライブラリによって満たされることを期待する要件に名前を付けることができない場合は、最も可能性の高いものを必要としません...

多くの電力を必要とする場合がありますPDFファイルの生成、あなたがしたい場合がありますこのバックグラウンドプロセスを、自分のマシン上のメインWebアプリケーションから遠ざけてください。

単純なJavaプロセスであれば、通常は自分の環境を制御して移動する方が簡単です。

私にとっては、これは "plain" java - KISSの単純なタスクのようです。または私は何かを逃していますか?

私はたわごと:-) が起こるので、すなわちのみ(場合には、あなたが処理を停止する必要が未処理のユーザーを取得し、Finderがデータベースからユーザーをフェッチするために使用することは

  • 再開可能であることを確認したいです
  • は、データベースの往復を維持し、ローロードを維持するためにバッチで実行されます。
  • は、マルチスレッド対応です。つまり、userIdが均等に分散されていると仮定して、必要。
0

このプロセスにはバネバッチを使用する必要があります。ユーザーがボタンを押すと、ジョブは非同期で起動されます。それは別のスレッドで実行され、すべてのレコードを処理します。ジョブの現在のステータスは、ジョブリポジトリから取得できます。このような処理のためにSpringバッチが作成されます。

+0

スレッドなどを使用するだけで、これにスプリングバッチを使用することはできませんか? – ashishjmeshram

+0

Springバッチは、このようなメモリを効率的かつデータベースにやさしい方法で処理しなければならない数百万のレコードを処理することができるため、優れています。これは、処理しているレコードを指定できるサイズのバッチに分割するため、メモリー効率的です。非常に長時間実行されているトランザクションがなく、ジョブを正しく構築しているため、データベーストランザクションは非常に小さなデータセットでのみ動作し、全体のデータセットでは動作しませんジョブが処理中です。 – httPants