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

今日 はQuartz よりも簡単・手軽にタスクのスケジュール管理・実行が出来る cron4j をご紹介します。
が、もし Java で実装できればアプリケーションから OS 固有の仕組みを削除でき、より WORA (Write One Run Anyware)なアプリケーションを実現出来る、タスクの実行結果を簡単に他の Java オブジェクトと共有可能といったメリットもありますよ。
今日 はQuartz よりも簡単・手軽にタスクのスケジュール管理・実行が出来る cron4j をご紹介します。
cron4j のダウンロードと設定
まずはプロジェクト・ページから cron4j をダウンロードしましょう。
zipファイルに含まれる cron4j-x.x.x.jar をクラスパスに追加すれば準備はおしまい。
さあ、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 ライフを!
仕事がヘタすぎるから、時間管理の達人になってみた
posted with amazlet at 13.07.16
呉 琢磨
ぱる出版
売り上げランキング: 233,555
ぱる出版
売り上げランキング: 233,555
増補改訂版Java言語で学ぶデザインパターン入門
posted with amazlet at 13.07.16
結城 浩
ソフトバンククリエイティブ
売り上げランキング: 8,985
ソフトバンククリエイティブ
売り上げランキング: 8,985
この記事へのトラックバックURL
http://trackback.blogsys.jp/livedoor/netbuffalo/4525514