かとじゅんの技術日誌

技術の話をするところ

S2Chronosでバッチ処理をつくってみよう

1.0.0をリリースした記念にS2Chronosの使い方を簡単に紹介していく記事を書いていきたいと思います.

セットアップ

セットアップ手順は
http://s2chronos.sandbox.seasar.org/ja/install.html
をご覧ください.

サンプルのダウンロードは
http://s2chronos.sandbox.seasar.org/ja/download.html
からお願いします.
コンソール版のサンプルはs2chronos-example-1.0.0.zip
Teeda版のサンプルはs2chronos-teeda-example-1.0.0.zip
SAStruts版のサンプルはs2chronos-sastruts-example-1.0.0.zip
です.
コンソールアプリではスケジューラの起動命令を記述する必要があります.三行で書けますw

	public static void main(String[] args) {
		SingletonS2ContainerFactory.init();
		SingletonS2Container.getComponent(Scheduler.class).process();
		SingletonS2ContainerFactory.destroy();
	}

アプリケーションサーバS2Chronosを内包しウェブアプリとバッチ処理を同居させることができます.ただし,S2ContainerServletより後に起動するようにload-on-startupを調整してください.

    <servlet>
        <servlet-name>chronosServlet</servlet-name>
        <servlet-class>org.seasar.chronos.extension.servlet.S2ChronosServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
    </servlet>

すでに持っているDIできる資産を好きなだけバッチ処理にDIしてください.

バッチ処理はタスククラスを書くことから

ルートパッケージ名+taskに,クラスサフィックスがTaskで終わるクラス名で以下のようなタスククラスを定義しましょう.すると,アプリケーションを起動したときにS2Chronosがタスククラスを見つけて,スケジューラに自動的にスケジュール登録します.このサンプルは,1分ごとにdoExecuteメソッドを呼び出し,ログを出力します.

@Task
@CronTrigger(expression = "0 */1 * * * ?")
public class SampleTask {
    
    private static Logger log = Logger.getLogger(SampleTask .class);
    
    // タスク処理
    public void doExecute() {
        log.info(this.getClass().getSimpleName() + ":doExecute");
    }

}

ちなみに,@Taskがついていない,トリガーが指定されていないタスクはスケジューリングされません.(Taskアノテーションがついていても,@Task(autoSchedule=false)の場合はスケジューリングされません)

実行時間はトリガーで指定する

トリガーはタスクを起動する時間を指定する役割を持っています.標準でいくつかのトリガーが用意されていますが,やはり最も利用するのがクローントリガーです.上記の例ではCROND形式の起動条件を指定して1分ごとにタスクが起動するようにしています.

単純なバッチ処理であれば覚えることはこれだけ.次回はスケジューラのスレッドの話をさせてもらいます.