連載
» 2008年04月17日 00時00分 公開

Javaバッチ処理は本当に業務で“使える”の?(2):OSSのJavaバッチフレームワークでHello World! (3/3)

[池田貴之,株式会社NTTデータ]
前のページへ 1|2|3       

HelloWorld!アプリケーションの実装

対象データの取得はコーディングレス

 1ページ目の「TERAバッチの特徴」の「TERAバッチのアーキテクチャ」でも述べましたが、TERAバッチでは、入力処理と業務ロジック(出力処理を含む)を別のモジュールにて設定・実装します。入力処理は、「対象データ取得」機能(「コレクタ」と呼ぶこともあります)を利用し、業務ロジックは、「ビジネスロジック実行」機能を利用します。

 「対象データ取得」機能には、ファイルやDBから順次データを読み込むための実装があらかじめ用意されています。業務開発者はごく簡単な設定ファイルやアノテーションを記述するだけで、対象リソースからのレコード読み取り、業務入力クラス(JavaBean)への値詰め替え、ビジネスロジックの呼び出しを行うことができます。

図4 対象データの取得 図4 対象データの取得

 ではこれから、業務入力クラスの実装と、「対象データ取得」機能の設定を行っていきます。

 繰り返しますがTERAバッチでは、ファイルからJavaBeanへのマッピングを、アノテーションとして記述します。すなわち、「対象データ取得」機能(コレクタ)から、ビジネスロジックに引き渡されるJavaBeanさえ実装すれば、CSVファイルから値を読み込み、内容をビジネスロジックに渡すことができるわけです。

 「sources」フォルダ配下に「jp.terasoluna.batch.sample.uc0001.JB0001Data」クラスを以下のとおり作成します。

package jp.terasoluna.batch.sample.uc0001;

import jp.terasoluna.fw.file.annotation.FileFormat;
import jp.terasoluna.fw.file.annotation.InputFileColumn;

@FileFormat
public class JB0001Data {

    /**
    * ID
    */

    @InputFileColumn(columnIndex = 0)
    private int id = 0;

    /**
    * 名前
    */

    @InputFileColumn(columnIndex = 1)
    private String name = null;

    /**
    * メッセージ
    */

    @InputFileColumn(columnIndex = 2)
    private String message = null;

〜 (省略、各フィールドの setter/getterメソッドの記述) 〜
}

 簡単に、上記のプログラムを解説します。import文では、利用するアノテーションをインポートしています。クラスに付いているアノテーション「@FileFormat」により、フレームワークは、このクラスが入力フォーマット情報を持つことを認識します。

 フィールドに付いているアノテーション「@InputFileColumn」により、CSVのカラム情報とのマッピングを図ります。このアノテーションにより、フレームワークは、CSVファイルの1カラム目をidフィールドへ、2カラム目をnameフィールドへ、3カラム目をmessageフィールドへ格納します。

 続いて、ジョブBean定義ファイル「JB0001.xml」に対象データ取得処理の定義を追加します。利用するコレクタをジョブBean定義ファイルの<beans></beans>ネスト内に追加します。

<!-- コレクタの設定 -->
<bean id="collector" parent="fileChunkCollector">
  <property name="fileQueryDao" ref="csvFileQueryDAO" />
  <property name="inputFileName" value="inputfile/inputdata.csv"/>
  <property name="resultClass">
    <bean class="jp.terasoluna.batch.sample.uc0001.JB0001Data"/>
  </property>
</bean>

 今回の例では、CSVファイルの読み込みなので、「対象データ取得」処理(コレクタ)として「fileChunkCollector」を、ファイルアクセス用クラスとして「csvFileQueryDAO」を利用しています。固定長ファイルやそのほかのファイル、DBから読み込むときには、ほかのコレクタ、DAO()を利用します。

 以上で、入力処理(対象データ取得処理)の実装は完了です。

ビジネスロジックの実装

 ビジネスロジッククラスには、前ページで定義したアプリケーションの仕様のとおり、入力データを標準出力に出力するクラスを実装します。「sources」フォルダを配下に、「jp.terasoluna.batch.sample.uc0001.JB0001BLogic」クラスを作成し、下記の実装をします。

package jp.terasoluna.batch.sample.uc0001;

import jp.terasoluna.batch.sample.uc0001.JB0001Data;
import jp.terasoluna.fw.batch.openapi.BLogic;
import jp.terasoluna.fw.batch.openapi.BLogicResult;
import jp.terasoluna.fw.batch.openapi.JobContext;
import jp.terasoluna.fw.batch.openapi.ReturnCode;

public class JB0001BLogic
implements BLogic<JB0001Data, JobContext>{
    public BLogicResult execute(JB0001Data data,
                                JobContext context) {
        System.out.println("[" + data.getId() + "]"
            + data.getName() + "さん、" + data.getMessage());
        return new BLogicResult(ReturnCode.NORMAL_CONTINUE);
    }
}

 ビジネスロジッククラスは、「BLogic」インターフェイスを実装します。ジェネリック型の第1パラメータには、対象データ取得処理で利用したJavaBeanを指定します。第2パラメータには、ジョブ前処理や後処理に情報を受け渡す際に利用するコンテキストクラスを指定します。今回は、複数の処理間で持ち回る情報がないため、デフォルトのコンテキストクラス「JobContext」を利用します。

編集部注:ジェネリック型についての詳細は、「J2SE 5.0「Tiger」で何が変わるか?」をご参照ください。

 リターンコードとして、「NORMAL_CONTINUE」を指定します。リターンコードにはこれ以外に、「NORMAL_END」「ERROR_CONTINUE」「ERROR_END」があります。

 最後に、ジョブBean定義ファイル「JB0001.xml」にビジネスロジックの定義を追加します。以下の定義を<beans></beans>ネスト内に追加します。

<bean id="blogic"
  class="jp.terasoluna.batch.sample.uc0001.JB0001BLogic"/>

実際に動作確認

 それでは、実際に動かしてみましょう。Eclipse上でJavaアプリケーションとして起動します。Eclipseの[実行]ダイアログを開き、[メイン]タブの[プロジェクト]に「terasoluna-batch-blank」を指定、[メイン・クラス]にTERAバッチが提供する「jp.terasoluna.fw.batch.springsupport.init.JobStarter」を指定します。

 そして、[引数]タブの[プログラムの引数]において、第1引数にジョブID(JB0001)、第2引数にジョブBean定義ファイルのパス(sample/UC0001/JB0001.xml)を入力して、実行します。以下のようなログが出力されれば、成功です。

[2008/03/18 21:54:29] [JobStarter ] [DEBUG] start Batch
[2008/03/18 21:54:30] [JobRequestInfo ] [DEBUG] parameter values:[jobId=JB0001][jobDiscriptPath:sample/UC0001/JB0001.xml][parameters:[]][jobRequestNo:]
[2008/03/18 21:54:30] [JobExecutor ] [DEBUG] 【START】 [jobId=JB0001] [jobRequestNo=] [StartType=SYNC]
[2008/03/18 21:54:30] [JobManager ] [DEBUG] 【START】 [jobId=JB0001] [jobRequestNo=] [partitionNo=-1] [JobManagerName=noTransactionJobManager] [JobState=STARTED]

[1] 出田太郎さん、ほげほげ
[2] 寺田反男さん、げげげげ

[2008/03/18 21:54:30] [JobManager ] [DEBUG] 【 END 】 [jobId=JB0001] [jobRequestNo=] [partitionNo=-1] [JobManagerName=noTransactionJobManager] [JobState=ENDING_NORMALLY]
[2008/03/18 21:54:30] [JobExecutor ] [DEBUG] 【 END 】 [jobId=JB0001] [jobRequestNo=] [StartType=SYNC] [jobExitCode=0]
[2008/03/18 21:54:30] [JobStarter ] [DEBUG] end Batch

次回はDBを利用したバッチアプリケーション

 今回は、CSVファイルから1行ずつデータを読み込み、ビジネスロジックを呼び出すアプリケーションを実装しました。TERAバッチの特徴とアプリケーション作成時に必要な作業を理解していただけましたか?

 次回以降は、DBを利用したバッチアプリケーションを作成していきます。

 今回作成したアプリケーションのファイルは、SourceForgeからダウンロードできます。こちらのページからダウンロードしてください。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。