2013年07月17日

Java cron 実装 - cron4j ライブラリでタスクのスケジュール実行を簡単実装する

cron は cron を使えばいい、Java に cron 実装を求めるなんて不思議に思うかもしれませんね。
が、もし Java で実装できればアプリケーションから OS 固有の仕組みを削除でき、より WORA (Write One Run Anyware)なアプリケーションを実現出来る、タスクの実行結果を簡単に他の Java オブジェクトと共有可能といったメリットもありますよ。

java cron

今日 はQuartz よりも簡単・手軽にタスクのスケジュール管理・実行が出来る cron4j をご紹介します。


cron4j のダウンロードと設定


まずはプロジェクト・ページから cron4j をダウンロードしましょう。

cron4j - a pure Java cron-like scheduler


zipファイルに含まれる cron4j-x.x.x.jar をクラスパスに追加すれば準備はおしまい。

cron4j をビルドパスへ追加

さあ、Java で cron してみましょうか。


cron4j - 基本的な使い方


最もシンプルな方法でタスクをスケジュール実行してみます。

まず、次のような Runnable なタスクを実装したクラスを用意して、

public class CronTask implements Runnable {

  @Override
  public void run() {
    System.out.println(new Date()+": Hello cron4j!");
  }

}


このタスクを次に示すコードでスケジューリングします。

public class MyCronApp {

  /**
   * @param args
   */
  public static void main(String[] args) {
    MyCronApp app = new MyCronApp();
    try {
      app.schedulerSimple();
      System.out.println("Press Ctrl+C to stop.");
      Thread.sleep(100000000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  
  public  void schedulerSimple() {
    Scheduler scheduler = new Scheduler();
    // every minute.
    scheduler.schedule("* * * * *", new CronTask());
    // start cron4j scheduler.
    scheduler.start();
  }
}

ね、簡単でしょ。 Scheduler インスタンスに cron 書式で日時・間隔を指定し、用意したタスクをスケジュールに登録するだけ。

この例では間隔は毎分("* * * * *")として、スケジュールを start() しています。

このコードを実行すると1分毎に以下のような出力が得られるはずです。

Press Ctrl+C to stop.
Tue Jul 16 21:35:00 JST 2013: Hello cron4j!


cron4j - ファイルを使ったタスク・スケジューリング


利用するならこのケースが多いでしょうか。 次は本家 cron の定義と同じように crontab にタスクを定義、Javaタスクをスケジュール実行してみます。

まずは登録するタスクの用意。これにはルールがあり、static で String の配列を引数として受け取るメソッドを用意する必要があります。

public class MyTask {

  public static void execute(String[] args) {    
    System.out.println(new Date() + ": NUM ARGS ["+ args.length+"]");
  }

}


続いて crontab 相当のファイルを用意・スケジュールを定義します。

- crontab.txt -
* * * * * java:MyTask#execute "ARG1" "ARG2"


Javaオブジェクトをスケジュールする場合、”java:”に続けてパッケージ.クラス名#メソッド名、あれば引数を記述します。
(もちろん、一般的な cron 同様に単純にコマンドを定義することも出来ますよ)

さあ、最後にスケジューリング。 これは次のようなコードになります。

  public void schedulerFromFile() {
    Scheduler scheduler = new Scheduler();
    scheduler.scheduleFile(new File("crontab.txt"));
    // start cron4j scheduler.
    scheduler.start();
  }


schedulerSimple() の代わりにこのメソッドを呼び出すと1分毎に次のようなメッセージが出力されます。

Press Ctrl+C to stop.
Tue Jul 16 21:08:00 JST 2013: NUM ARGS [2]


もちろん、途中で行をコメントアウト(#)すればタスクの実行は中止されますし、間隔を変更することも可能。

Tue Jul 16 21:08:00 JST 2013: NUM ARGS [2]
- スレッド起動中にcrontab.txt を編集し、5分毎(”*/5 * * * *")に変更 -
Tue Jul 16 21:10:00 JST 2013: NUM ARGS [2]

ここまで試せば cron4j の実力に納得するはずですよ。

 

cron4j - タスクのイベント通知・連携


折角、ピュア Java でスケジュール実行するんですからタスクと他の Java オブジェクトを連携させてみましょう。

Java オブジェクト間でイベント連携する場合には Task クラスを継承した独自タスクを用意します。

public class MyExtTask extends Task {

  public boolean supportsStatusTracking() {
    return true;
  }
  
  @Override
  public void execute(TaskExecutionContext ctx) throws RuntimeException {    
    System.out.println(new Date()+": Hello cron4j!");
    ctx.setStatusMessage("STATUS: OK");
  }

}

ここでは異常終了を実装していませんが、失敗した場合は RuntimeException をスローしましょうね。

後もう一つ、SchedulerListener インタフェースを実装したイベント・リスナーを用意。

public class MyTaskListener implements SchedulerListener {

  @Override
  public void taskFailed(TaskExecutor te, Throwable e) {
    System.out.println("Failed: " + e.getMessage());
  }

  @Override
  public void taskLaunching(TaskExecutor te) {
    System.out.println("Starting: " + te.getTask().getClass().getSimpleName());
  }

  @Override
  public void taskSucceeded(TaskExecutor te) {
    System.out.println("Succeed: " + te.getStatusMessage());
  }

}


最後にこの2つを次のコードでスケジューリングします。

  public void schedulerEvent() {
    Scheduler scheduler = new Scheduler();
    scheduler.addSchedulerListener(new MyTaskListener());
    // every minute.
    scheduler.schedule("* * * * *", new MyExtTask());
    // start cron4j scheduler.
    scheduler.start();
  }


実行すると開始・終了タイミング、正常/異常終了を検知できるはずです。

Press Ctrl+C to stop.
Starting: MyExtTask
Tue Jul 16 21:28:00 JST 2013: Hello cron4j!
Succeed: STATUS: OK

より詳しい使い方はダウンロードしたzipファイルに含まれる examples 配下のサンプル・コードをどうぞ。

それでは、より良い cron ライフを!


仕事がヘタすぎるから、時間管理の達人になってみた
呉 琢磨
ぱる出版
売り上げランキング: 233,555

増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ
売り上げランキング: 8,985

Posted by netbuffalo at 01:05│Comments(0)TrackBack(0) Java | プログラミング


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/4525514

コメントする

名前
 
  絵文字