この記事はアピリッツの技術ブログ「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の説明となります。
他にも動的にスケジュールの時間を決められたりするので、また何か発見しだい投稿したいと思います。