その他
    ホーム 技術発信 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の説明となります。

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