今回、SAStrutsを利用してサービスを構築した際に、
「定期的」にデータベースを監視する処理を作る必要がありました。
Linuxサーバで稼働させるので、cronでジョブを呼ぶ形でも良かったんですが、
他のサービスも同一サーバで稼働させる予定で、なるべく各サービスの処理は、各サービスの処理内で完結したかったんです。
そこで、s2chronosを選択してみました。
s2chronosは、定時処理をスケジュールすることができ、
さらに、SAStrutsで作成したServiceクラスをそのまま利用することができます。
これで、定時処理も各サービス内で完結することができます。
必要なファイルをダウンロード
chronosCustomize.diconを作成
[src/main/resources]の下に[chronosCustomize.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="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]パッケージに定時処理クラスを作成します。
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は便利に使わせてもらいました。
まだまだ、機能が豊富なようなので追跡してみます。