SpringのDIを使ったビジネスロジックの実装
業務処理で実行されるビジネスロジックの実装・設定ファイル定義をします。
SQLを実行する際に必要となるクラスを作成
まず、ビジネスロジック内でSQLを実行する際に必要となるクラスを作成します。今回、ビジネスロジック内では残高テーブルからデータを取得し、そのデータを基にテーブルに対して更新・新規追加をするわけですが、ここで作成するクラスは、データ取得時はSQLの結果格納クラス、更新・新規追加時にはSQLのパラメータクラスとなります。
「source」フォルダ配下に「jp.terasoluna.batch.sample.uc0002.JB0001zandakaData.java」を以下のとおり作成します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
update文やinsert文を定義
次に、先ほどと同様に、「UC0002_sqlMap.xml」にSQL文を定義します。使用するSQLは「残高を取得するSQL」「残高テーブルを更新するSQL」「残高テーブルにレコードを新規追加するSQL」の3つです。以下の定義を<sqlMap></sqlMap>内に追加します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
select文を定義するときと同じ要領で、update文やinsert文を定義します。SQL実行時に、parameterClass要素に記述したクラスのフィールドの値をSQL文のパラメータに埋め込むことができ、どの値を埋め込むかは「#フィールド名#」と指定します。プリミティブ型のラッパークラスについては「#value#」と指定します。
ビジネスロジッククラスを作成
続いて、ビジネスロジッククラスを作成します。今回は、型パラメータに「JB0001nyukinData」と 「JB0001JobContext」を指定します。「source」フォルダ配下に「jp.terasoluna.batch.sample.uc0002.JB0001BLogic.java」を以下のとおり作成します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
「QueryDAO」クラスと「UpdateDAO」クラスはTERASOLUNAが提供しているDAO(Data Access Object)で、内包しているSpringの機能によってDI(Dependency Injection、依存性の注入)されます。
編集部注:SpringとDIについて詳しく知りたい読者は、インデックス「DI×AOP(Spring/Seasarなど)」をご覧ください。
「QueryDAO」は参照系(select文)を実行する際に利用するDAOで、executeForObjectメソッドは取得する結果が1件の場合に利用します。第1引数にsqlMapファイルで定義したSQL文のid、第2引数にパラメータのオブジェクト、第3引数に結果格納オブジェクトのClassクラスを渡します。
「UpdateDAO」は更新系(update文、insert文、delete文)を実行する際に利用するDAOです。第1引数にsqlMapファイルで定義したSQL文のid、第2引数にパラメータのオブジェクトを渡します。
ジョブBean定義ファイルにビジネスロジッククラスを利用する定義を追加
また、ジョブBean定義ファイルに上記で作成したビジネスロジックを利用する定義を追加します。以下の定義を<beans></beans>内に追記してください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
Bean要素のネスト内にSpringでDIするインスタンスを設定します。ここでは、「queryDAO」「updateDAO」をDIしています。「queryDAO」「updateDAO」のインスタンスの定義はフレームワークにて別途設定されているので、業務開発者は意識する必要はありません。
また、「blogic」「queryDAO」「updateDAO」はTERAバッチが提供する固定のBeanなので、名称の変更はできません。
前準備・後始末を忘れずに
ジョブの前処理・後処理は、メインとなるビジネスロジックのループ(業務処理)の前後に実行される処理で、ちょっとした処理を実行したいときに利用するものです。
ここで注意すべき点は、ビジネスロジック1回ごとに呼び出されるのではなく、ビジネスロジックのループが開始される前、ループが終了した後に前処理・後処理がそれぞれ1回呼ばれるという点です。
ジョブ後処理のみ実装
今回は、ジョブ後処理のみ実装してみましょう。「source」フォルダ配下に「jp.terasoluna.batch.sample.uc0002.JB0001JobPostLogic.java」を以下のとおり作成します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ジョブ前処理・後処理の実装ルールはビジネスロジックの実装ルールと非常に似ています。
ジョブ前処理・後処理クラスは、「SupportLogic」インターフェイスを実装し、ジェネリック型の第1パラメータにはジョブコンテキストクラスを指定します。ビジネスロジックと異なり、業務入力クラスに対する処理は行わないので、当然ジェネリック型、メソッドの引数に業務入力クラスを指定しません。処理の最後に、ビジネスロジックと同様に、リターンコードとして「NORMAL_CONTINUE」を指定します。
編集部注:ジェネリック型についての詳細は、「J2SE 5.0「Tiger」で何が変わるか?」をご参照ください。
ジョブBean定義ファイルにジョブ後処理を利用する定義を追加
最後に、ジョブBean定義ファイルに上記で作成したジョブ後処理を利用する定義を追加します。以下の定義を<beans></beans>内に追記してください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
Eclipse上で実際に動作確認してみよう
それでは、実際に動かしてみましょう。Eclipse上でJavaアプリケーションとして起動します。
前回と同じ要領で、Eclipseの[実行]ダイアログを開き、[メイン]タブの[プロジェクト]に「terasoluna-batch-sample-foratmarkit03」を指定、[メイン・クラス]にTERAバッチが提供する「jp.terasoluna.fw.batch.springsupport.init.JobStarter」を指定します。
そして、[引数]タブの[プログラムの引数]において、第1引数にジョブID「JB0001」、第2引数にジョブBean定義ファイルのパス「sample/UC0002/JB0001.xml」を入力して、実行します。以下のように、ジョブの起動・終了に加え、処理件数のログが出力されれば、成功です。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
また、残高テーブルが以下のように更新されていることを確認してください。
TERAバッチは標準的なオープンソースの組み合わせ
今回は、DBからデータを読み込み、ビジネスロジックを呼び出すアプリケーションを実装しました。HelloWorldアプリケーションでは触れなかったTERAバッチの利用方法について理解していただけましたか?
TERAバッチは、Spring Framework(DIコンテナ)、iBATIS(O/Rマッピングツール)をはじめとした多くの標準的なオープンソースのプロダクトを組み合わせて作られています。そのため、これらの機能の知識がある場合は、学習コストもさほど掛かりませんし、Spring FrameworkやほかのTERASOLUNAフレームワークを利用したアプリケーションなどとの連携・モジュールの共通化も可能です。
次回は、最終回です。TERAバッチの特徴的、重要な機能について紹介していきます。なお、今回作成したアプリケーションのファイルは、SourceForgeからダウンロードできます。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- バッチ処理でデータベースアクセスを効率化する
Java TIPS - データベースの利用に便利なEclipseプラグイン
CoolなEclipseプラグイン(9) - 20世紀のJavaの歴史と21世紀への5つの提案
[コラム]米持幸久のJava Issue(2) - 開発存続の危機で分かったSEに必要なスキル
開発現場で学べること(6) - Webと企業システムをつなぐアーキテクチャ
[連載]Webと企業システム結ぶ実践的アーキテクチャ(1)