035 jboss-5.1.0.GAでcronのような定期処理を実現


こんにちは、id:EC-OneのAkiです。
ちょっと間が空いてしまいましたが、その間、プロジェクト支援や調査依頼等でナレセンメンバ一同忙しくしておりました。
今回はそれらの調査の中から、ひとつご紹介したいと思います。

定期処理を行うには

定期的な処理を行うには OS の力を借りて実現する事が多いですね。Unix 系の cron や Windows 系のタスクスケジューラ等。
しかし、今回依頼のあったプロジェクトでは、運用チームとアプリ開発チームの分担やAPサーバ水平分散等の事情もあり、JBoss の機能を使用して実現することにしました。
それでは参りましょう!

JBossでの定期処理

jboss-5.1.0.GA 上で periodical な処理をする機能としては Timer と Scheduler があります。
Timer は実際に行いたい処理を設定ファイルの中に直接 beanshell というスクリプト言語で記述しなければなりません。
これに対して Scheduler は、設定ファイルの中で実行する java のクラスを指定する形ですので、今回のプロジェクトでは Scheduler での実現の方が良い、ということになりました。
以下、簡単な例です(WindowsXP 上の jboss-5.1.0.GA です)。

1. JBoss を起動します。

set JAVA_HOME=C:\Java\jdk1.6.0_16
set PATH=C:\Java\jdk1.6.0_16\bin;%PATH%
cd C:\jboss-5.1.0.GA\bin
run.bat

2. Scheduler でキックされる java のクラスを作成します。

package scheduler_sample;

import java.util.Date;
import org.jboss.varia.scheduler.Schedulable;
import org.apache.log4j.Logger;

public class Sample1ExSchedulable implements Schedulable {
    private static final Logger log = Logger.getLogger(Sample1ExSchedulable.class);
    private String arg1;
    private long arg2;

    public Sample1ExSchedulable(String arg1, long arg2) {
        this.arg1 = arg1;
        this.arg2 = arg2;
    }

    public void perform(Date now, long remainingRepetitions) {
        log.info("perform!!! now[" + now + "]" +
                 " remainingRepetitions[" + remainingRepetitions + "]" +
                 " arg1[" + arg1 + "]" +
                 " arg2[" + arg2 + "]");
    }
}

3. Scheduler でキックされる java のクラスをデプロイします
 ( Sample1ExSchedulable.javaコンパイルし、できたクラスファイルを scheduler_sample1.jar という名前の jar に固め、
  その scheduler_sample1.jar を C:\jboss-5.1.0.GA\server\default\deploy にコピーします)。

4. Scheduler の設定を行います。C:\jboss-5.1.0.GA\server\default\deploy にある scheduler-service.xml を以下のように編集します。

<?xml version="1.0"?>
<server>
  <mbean code="org.jboss.varia.scheduler.Scheduler"
         name="jboss.docs:service=Scheduler">
    <attribute name="StartAtStartup">true</attribute>
    <attribute name="SchedulableClass">scheduler_sample.Sample1ExSchedulable</attribute>
    <attribute name="SchedulableArguments">knowledge-center,123</attribute>
    <attribute name="SchedulableArgumentTypes">java.lang.String,long</attribute>
    <attribute name="InitialStartDate">NOW</attribute>
    <attribute name="SchedulePeriod">60000</attribute>
    <attribute name="InitialRepetitions">-1</attribute>
  </mbean>
</server>

5. 動作確認を行います。run.bat を実行しているコマンドプロンプトに、60秒ごとに、以下のログが出力されます。

13:17:15,963 INFO  [Sample1ExSchedulable] perform!!! now[Fri Nov 06 13:17:15 JST 2009] remainingRepetitions[-1] arg1[knowledge-center] arg2[123]

終わりに

以上が「OSに頼らずにJBossだけで定期処理を実現する方法」でした。
cron やタスクスケジューラ等での実装では、処理の先頭でまず JBoss が起動しているかいないかのチェックをしなければいけないケースがあります。この方法ではそもそも JBoss が起動している時のみ実行されますので、そのようなチェックが不要になります。意外と使えるケースがあるのではないでしょうか。

ナレッジセンターでは、「運用が楽になるようにアプリを作りたい」などの相談も受け付けます。
トライアルで質問を無料で受け付けるキャンペーンも実施しておりますので、お気軽にお問い合わせ下さい!







JavaRuby及び周辺のソフトウェアを用いた開発に関して、企業があらゆる悩みごとを相談できるのが、ナレッジセンターの「レスキューサービス」です。
どんな相談でも親身に受け付けますので、レスキューサービスってなに?もっと知りたい!と思った方はお気軽に問い合わせ下さい。
問い合わせ画像リンク