Name
Password

バッチプログラムの作成

  • 2009-10-08 15:13:35

ymir-batchモジュールを利用すると、Webアプリケーションが持つコンポーネントを使って動作するバッチを簡単に作成することができます。

セットアップ

Viliで作成したYmirアプリケーションプロジェクトでymir-batchを使うには、Viliの「フラグメントを追加・更新」メニューを選択して表示される「フラグメントの追加」ダイアログで「バッチ機能」にチェックを入れてNext→Finishとして下さい。ビルドパスにymir-batchのJarが追加されるとともに、src/main/webapp/WEB-INF/batch/ 以下にバッチを起動するためのスクリプトファイル等が追加されます。

バッチの作成

バッチの処理クラスは、batchサブパッケージ以下に「~Batch」という名前で作成して下さい。また、org.seasar.ymir.batch.Batchインタフェースを実装するようにして下さい。

Batchインタフェースにはinit、execute、destroyの3つのメソッドがあります。

initメソッドではバッチを動作させるための初期処理を行なって下さい。引数としてはコマンドライン引数が渡されます。initメソッドの返り値がfalseの場合はそこでバッチスクリプトの実行が終了コード1で終了します。

executeメソッドでは主となる処理を行なって下さい。返り値としてはバッチスクリプトの終了コードを返すようにして下さい。

データベースを使用するアプリケーションでは、executeメソッドにトランザクション境界が設定されますので、executeメソッドの処理を開始する時点でトランザクションが開始され、executeメソッドを抜けた時点でトランザクションがコミットされます。executeメソッドの内部で例外が発生した結果executeメソッドを抜けた場合はトランザクションはロールバックされます。

destroyメソッドではバッチの終了処理を行なって下さい。

バッチコンポーネントは自動的にSeasar2に登録されますので、バッチクラスのためのコンポーネント定義をdiconファイルに記述する必要はありません。

バッチの実行

作成したバッチを実行するには、WEB-INF/batch/ ディレクトリでシェルから以下のようにして下さい(下の例はWindows環境の場合):

run.bat バッチクラス名またはバッチコンポーネント名

例えば作成したバッチクラスがcom.example.batch.HelloBatchの場合は以下のようにして下さい:

run.bat com.example.batch.HelloBatch

または:

run.bat helloBatch

または、以下のようにコンポーネント名から「Batch」を除いても構いません:

run.bat hello

バッチクラスのユニットテスト

バッチクラスは通常のPOJOと同様に、JUnit等を使ってユニットテストを行なうことができます。

バッチクラスの統合テスト

バッチを起動するためのorg.seasar.ymir.batch.Bootstrapクラスを使うことで、バッチクラスを実際に動作させるようなテストを記述することもできます:

import org.seasar.ymir.batch.Bootstrap;

public class HogeBatchTest extends TestCase {
    public void test() throws Exception {
        // テスト対象のバッチを起動  ↓バッチクラス名とコマンドライン引数を指定
        Bootstrap.main(new String[]{ HogeBatch.class.getName() });

        // DBの内容等をassert
    }
}

または:

import org.seasar.ymir.batch.Batch;
import org.seasar.ymir.batch.BatchLauncher;

public class HogeBatchTest extends TestCase {
    public void test() throws Exception {
        // テスト対象のバッチオブジェクトを作成
        Batch target = new BatchLauncher(HogeBatch.class);

        // テスト対象のバッチを実行
        target.init(new String[0]); // ←コマンドライン引数を指定
        target.execute();
        target.destroy();

        // DBの内容等をassert
    }
}