連載第1回の「鉄板焼きのお店から学ぶ、バッチ処理“超”入門」では、近年Javaによるバッチ処理が注目されてきており、商用やオープンソースのJavaバッチ処理用のソフトウェアが登場しつつあるという現状を紹介しました。
オープンソースのJavaバッチフレームワークとしては、SpringBatchがあるものの、2008年4月現在では正式版がリリースされたばかりで、日本語のドキュメントも少なく、本格的に採用するにはまだ早い状況だと思います。そんな中登場したのが、TERASOLUNA Batch Framework for Java(以下、TERAバッチ)です。今回は、TERAバッチのアーキテクチャと機能を簡単に紹介し、JavaバッチでHelloWorld!アプリケーションを実際に実装していくこととします。
バッチ処理を行ううえで、フレームワークとして用意されているとうれしい機能は何でしょうか。それは以下のような機能で、TERAバッチも持ち合わせている機能です。
TERAバッチでは、ファイルへの読み書きを行う機能を用意しています。CSVファイルや固定長ファイルと、JavaBeanのマッピングを、アノテーションベースで簡単に行うことができます。
TERAバッチでは、O/RマッピングツールとしてiBATISを利用することで、柔軟なSQL記述を行いつつ、JavaBeanへのマッピング処理を簡略化しています。
バッチ処理は性能が命ですので、複数(数百〜数千件)のINSERT、UPDATEを一括でコミットするように設計することがよくあります。TERAバッチは、一括トランザクション/コミットを行う機能を持っています。
正常な処理だけでなく、異常系にも十分対応することが必要です。TERAバッチには、異常なデータをはじく「入力チェック」機能、ロジック内部で発生した例外を統一的に扱う「例外処理」機能、処理途中から再開できる「リスタート」機能などを用意しています。
バッチ処理というと、夜間にジョブスケジューラから起動されて、長時間かけて大量データの処理を行うというイメージがあります。一方で、昼間にオンラインアプリケーションから直接呼び出されるものや、1回の処理時間が非常に短いものもあります。
前者のような処理は、1つのプロセスの中でさまざまな処理を行い、ジョブが完了したら、そのプロセスも消滅するという形態が最適です。一方、後者のような処理では、デーモンプロセスがキューに積まれたジョブを随時処理していくという形態にします。TERAバッチでは、前者を「同期ジョブ実行」、後者を「非同期ジョブ実行」と呼んでいます。
夜間の限られた時間内にジョブを終わらせなければならない場合に、ジョブの多重実行を行うことはよくあります。TERAバッチでは、入力データの値の範囲などを条件にしてジョブを多重実行できます(ジョブスケジューラの設定で多重実行を行い、フレームワークの機能を利用しないこともあります)。
以上のように、TERAバッチでは、バッチ処理に必要な機能を一通り有していますが、逆に、TERAバッチが持っていない機能としては、「ジョブスケジューリング」があります。
ジョブの依存関係を定義し起動する機能をTERAバッチは持っていません。“餅は餅屋”ということで、ジョブスケジューリングを行う場合、ベンダ製品ではJP1やSystemwalker、オープンソースではHinemosといったジョブスケジューラが存在するため、適したものを選択して利用してください。
筆者が考える、TERAバッチのメリットは以下のとおりです。
手前みそではあるのですが、現時点でのオープンソースJavaバッチフレームワークとしては、良いところにいるのではないでしょうか。
TERAバッチのアーキテクチャを一言で表すと、「入力と業務処理(+出力)の分割」です。ファイルやDBからデータを受け取る処理と、受け取ったデータを加工してファイルやDBに書き出す処理を、別のモジュールおよびスレッドで実行します。
こうすることで、入力と出力のどちらかで待ち(主に、I/O待ち)が発生しても、効率よく処理を継続することができます。これは、処理時間とCPU使用効率を重視するバッチ処理では大事なことです。
また、TERAバッチは、Spring Framework(DIコンテナ)、iBATIS(O/Rマッピングツール)をはじめとした多くの標準的なオープンソースプロダクトを組み合わせて作られています。そのため、これらの機能の知識がある場合は、学習コストもさほど掛かりませんし、Spring FrameworkやほかのTERASOLUNAフレームワークを利用したアプリケーションなどとの連携・モジュールの共通化も可能です。
それでは、次ページ以降で実際にJavaによるバッチ処理のアプリケーションを作っていきましょう。
Copyright © ITmedia, Inc. All Rights Reserved.