ホーム DoRuby S2Chronosでバッチ処理

S2Chronosでバッチ処理

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。wryyyです。

本日は、S2ChronosというSeasar2(Javaのフレームワーク)のプロジェクトをご紹介いたします。

ではまずS2Chronosとは何か!概要をご紹介いたします。

【概要】

S2Chronosは、Seasar2に対応したJavaオブジェクトスケジューリングフレームワーク。

日時に関連するビジネスロジックを、S2上でタスククラスとして登録し、スケジューリングすることが可能になる。

つまり、S2Chronosを使うことによって、アプリ上でバッチを動かすことができ、

バッチファイルを別途用意して、cronに登録して。。。という作業が必要なくなるのです!!

それでは、実際にS2Chronosの設定を行い、動作するようにしてみましょう。

1. Jarのダウンロード、ビルドパスに追加

http://s2chronos.sandbox.seasar.org/ja/download.html

上記、URLより

・s2chronos-core-1.0.0.jar

・s2chronos-extension-1.0.0.jar

をダウンロードし、プロジェクトのビルドパスに追加。

2. S2Chronos用ファイルの作成と設定変更

・chronosCustomizer.diconファイルを src/main/resources に作成します。

<?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> 
                // <- 実行するタスクがない場合自動的にスケジューラを終了させるかどうかのフラグ。
                         trueの場合自動的に終了します.
                <property name="autoFinishTimeLimit">5000L</property>
                // <- 実行するタスクがなくなってからどれぐらいでスケジューラを終了させるかの時間(msec).
                <property name="taskScanIntervalTime">2000L</property>
               // <- タスクを監視する時間間隔(msec).
                <property name="threadPoolType">@org.seasar.chronos.core.ThreadPoolType@CACHED</property> 
               // スケジューラのスレッドプールタイプを指定します.
        </component>
</components> 

・creator.diconに下記を追加します。

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

・customizer.diconに下記を追加します。

<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>

・src/main/webapp/WEB-INF/ にあるweb.xmlに下記を追加します。

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

3. パッケージの作成

プロジェクトの src/main/java にタスクパッケージを作成

例:hoge.task(.taskで終わるような名前にする。)

4. タスククラスの作成

上記のタスクパッケージにタスククラスを作成する。(HogeTask.java等、Taskで終わるような名前にする。)

packager hoge.task;

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

@Task
@CronTrigger(expression = "0 44 17 * * ?")
public class HogeTask {

    // タスク処理
    public void doExecute() {
        System.out.println(“test”);
    }
}

・@Task:タスクスケジューラとして、登録する。

・@CronTrigger(expression = “0 44 17 * * ?”):17時44分00秒にdoExecute()メソッドを実行する。

5. 起動、動作確認

上記プロジェクトをtomcatコンテキストに定義して、tomcat起動

CronTriggerアノテーションで指定した時間に、コンソール上に「test」の文字が出るか確認。

※補足

s2chronosをHOTdeployで実行すると、毎秒クラスの再ロードが行われ、ログが大変なことになる。

本番反映時には、COOLdeployにする。

COOLdeployにするためには、chronosCustomizer.diconを以下のように修正する。

<?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="hotdeployDisable">true</property> ←ここを追加
        <property name="daemon">true</property>
        <property name="autoFinish">true</property>
        <property name="autoFinishTimeLimit">5000L</property>
        <property name="taskScanIntervalTime">2000L</property>
        <property name="threadPoolType">@org.seasar.chronos.core.ThreadPoolType@CACHED</property>
    </component>
</components> 

(googleで調べるドキュメントとかには<property name=”hotdeployDisabled”>とかになっているので注意!!)

以上、簡単ですがS2Chronosの説明となります。

他にも動的にスケジュールの時間を決められたりするので、また何か発見しだい投稿したいと思います。

記事を共有

最近人気な記事