環境
巨大な PL/SQL システムを Java に移行するためのソリューションを作成中です。最初のステップは、次のような ETL ジョブを移行することです。
- 複数の ftp / sftp ソースから CSV、XML、(XLS、これは新しい要件です)、および位置ファイルを読み取ります
- データベースに保存されているルールに従ってファイルを処理し、結果をデータベース テーブルに書き込みます。
現在、これはいくつかのストア プロシージャとジョブによって行われています。
私の会社は提案を受け付けています (GlassFish 4 で実行でき、ロギングと接続プールのメカニズム、および管理コンソールを共有できる場合、それはプラスです)。
少し調べてみたところ、次のオプションが目に留まりました。
- Java EE 7 Batch Processingはシンプルに聞こえ、GlassFish 4 に特に適しています。
- Spring Batchはやや成熟しており、Java EE 7 標準 (おそらくそれに基づいていた) に非常に似ています。
- Apache Camelは強力に聞こえ、Apache POI などのライブラリをいじる必要がなくなりますが、やや複雑に見えます。また、それが仕事(巨大なファイルに対するETL)に最適かどうかもわかりません。
- 自分ですべてを調理します。Quartz / Spring Scheduler または EJB タイマーを実行するアプリケーション クライアントを作成できます。
私はまだ提案を受け入れていますが (推奨は素晴らしいでしょう)、これまでのところ、Java EE 7 バッチ処理が最適なようです。
もう 1 つ、インフラストラクチャ チームには、すべての ftp ソースからローカル ディレクトリにファイルを移動するソリューションがあるため、FTP は実際には問題になりません。
問題
私は Java EE バッチ処理に関するいくつかのチュートリアルを読みましたが、そのすべてで、ある種のServlet
またはEJB
タイマーがジョブの開始を担当しています。
JobOperator jobOperator = BatchRuntime.getJobOperator();
jobOperator.start("job", properties);
Web / EJB プロジェクトを簡単にアップロードして、変更をプールし続けることができました。しかし、私はプッシュモデルについて考えていました:
- アプリケーション クライアントコンソール アプリケーション
- メインクラスは新しいファイルのディレクトリを監視します
- 新しいファイルがあると、新しいジョブが開始されます。
私の疑問は次のとおりです。
- この戦略は可能/推奨されますか?
- 中間に JMS キューまたはある種のプロデューサー/コンシューマー戦略が必要ですか、それとも
jobOperator.start
すべてのファイルを呼び出してバッチ処理レイヤーを信頼してアプリケーション リソースを管理する必要がありますか? 言い換えれば、一度に 1000 個のファイルがフォルダーに配信されjobOperator.start
、1000 回呼び出した場合、GlassFish 4 はある種のスマートなエンキューを行うのでしょうか、n
それともジョブが同時に実行されないように何らかのゲートを作成する必要がありますか?