S2Chronosインストールガイド

今回、SAStrutsを利用してサービスを構築した際に、
「定期的」にデータベースを監視する処理を作る必要がありました。


Linuxサーバで稼働させるので、cronでジョブを呼ぶ形でも良かったんですが、
他のサービスも同一サーバで稼働させる予定で、なるべく各サービスの処理は、各サービスの処理内で完結したかったんです。


そこで、s2chronosを選択してみました。


s2chronosは、定時処理をスケジュールすることができ、
さらに、SAStrutsで作成したServiceクラスをそのまま利用することができます。


これで、定時処理も各サービス内で完結することができます。

構築環境

プロジェクトはDoltengで作成

必要なファイルをダウンロード

ビルドパスに追加

ダウンロードしたファイルを[src/main/webapp/WEB-INF/lib]フォルダにコピーして、ビルドパスに追加します。
http://dl.dropbox.com/u/1047086/20100421/01.JPG

chronosCustomize.diconを作成

[src/main/resources]の下に[chronosCustomize.dicon]を下の内容で作成します。
http://dl.dropbox.com/u/1047086/20100421/02.JPG

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <component name="schedulerConfiguration" class="org.seasar.chronos.core.SchedulerConfiguration">
        <property name="daemon">true</property>
        <property name="autoFinish">false</property>
        <property name="autoFinishTimeLimit">5000L</property>
        <property name="taskScanIntervalTime">30000L</property>
        <property name="threadPoolType">@org.seasar.chronos.core.ThreadPoolType@CACHED</property>
    </component>
</components> 

creator.diconに追記

[src/main/resources/creator.dicon]に、以下の内容を追記します。

<component class="org.seasar.chronos.core.creator.TaskCreator"/>
<component class="org.seasar.chronos.core.creator.TriggerCreator"/>

customizer.diconに追記

[src/main/resources/customizer.dicon]に、以下のcomponent定義を追記します。

<component name="taskSupportAspectCustomizer" class="org.seasar.framework.container.customizer.AspectCustomizer">
    <initMethod name="addInterceptorName">
        <arg>"aop.traceInterceptor"</arg>
    </initMethod>
    <property name="pointcut">"do.*, initialize, destroy"</property>
</component>
<component name="taskCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
    <initMethod name="addCustomizer">
        <arg>taskSupportAspectCustomizer</arg>
    </initMethod>
</component>
<component name="triggerSupportAspectCustomizer" class="org.seasar.framework.container.customizer.AspectCustomizer">
    <initMethod name="addInterceptorName">
        <arg>"aop.traceInterceptor"</arg>
    </initMethod>
    <property name="pointcut">".*"</property>
</component>
<component name="triggerCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
    <initMethod name="addCustomizer">
        <arg>triggerSupportAspectCustomizer</arg>
    </initMethod>
</component>

app.diconに追記

[src/main/resources/app.dicon]に、以下の内容を追記します。

<include path="chronos-extension.dicon"/>

web.xmlに追記

[src/main/webapp/WEB-INF/web.xml]に、下のservlet定義を追記します。
load-on-startupの数字は、他のservlet定義と重複しないようにする必要があります。
デフォルトであれば[3]です。

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

taskパッケージの作成

定時処理されるクラスは、[<ルートパッケージ>.task]パッケージに作成します。
そのために、まずtaskパッケージを作成します。
http://dl.dropbox.com/u/1047086/20100421/03.JPG

定時処理クラス(タスククラス)の作成

[<ルートパッケージ>.task]パッケージに定時処理クラスを作成します。

2010/04/22追記
クラス名の末尾は[Task]である必要があります。

package jp.test.s2chronos.task;

import org.seasar.chronos.core.annotation.task.Task;
import org.seasar.chronos.core.annotation.trigger.CronTrigger;

@Task
@CronTrigger(expression = "0 */1 * * * ?")
public class SampleTask {

	public void doExecute() {
        System.out.println("CronTriggerが1分ごとに実行されます。");
    }

}

動作確認

Tomcat起動すると、Consoleに1分ごとに出力されていることがわかります。

DEBUG 2010-04-21 22:13:28,696 [chronos-pool-3-thread-5] BEGIN jp.test.s2chronos.task.SampleTask#doExecute()
CronTriggerが1分ごとに実行されます。

(省略)

DEBUG 2010-04-21 22:14:28,712 [chronos-pool-3-thread-6] BEGIN jp.test.s2chronos.task.SampleTask#doExecute()
CronTriggerが1分ごとに実行されます。

まとめ

s2chronosは便利に使わせてもらいました。
まだまだ、機能が豊富なようなので追跡してみます。