QuartzはJBossなどにも組み込まれているJavaでは定番のジョブスケジューラですが、2.0にバージョンアップしてジョブの定義などを流れるインターフェースで行うようになっていました。これはびっくり。
ジョブはJobインターフェースを実装して作成したり、JobDetailでジョブの定義、Triggerでスケジューリングの定義を行うのはこれまで通り(微妙にAPIは変わっていますが)。ただ、JobDetailやTriggerの作り方がこんなことになっています。
import static org.quartz.JobBuilder.*; import static org.quartz.SimpleScheduleBuilder.*; import static org.quartz.TriggerBuilder.*; ... // ジョブの定義 JobDetail job = newJob(MyJob.class) .withIdentity("MyJob") .build(); // 1分ごとに繰り返し実行するトリガを作成(終了期限あり) Trigger trigger = newTrigger() .withIdentity("MyTrigger") .forJob(job) .startNow() // 今すぐ開始 .endAt(new Date(System.currentTimeMillis() + 1000 * 5)) // 終了時間(5秒後) .withSchedule(simpleSchedule() .withIntervalInMilliseconds(1000L) // 1秒間隔で実行 .repeatForever()) // 終了時間まで繰り返し .build();
これは使いやすいのかな…。正直、どうなんだろう。
流れるインターフェースって記述するコードが大量にあるときに威力を発揮するものだと思うのですが、ジョブのスケジューリングを行うコードなんて、そもそもそんなに大量にはないでしょうし、スケジュールも設定ファイルとかで制御することのほうが多い気がするので、実際に使うときにはJobDetailやTriggerを組み立てるコードよりも設定を読み込んだりするためのコードのほうが多くなる気がします。設定によって呼び出すメソッドが変わるようなケースだと流れるインターフェースの意味があまりなかったりしますね。
それと、Quartz 2.0の流れるようなインターフェースを使うにはstaticインポートしておかなければならないクラスがいくつかに分かれているので(上記の例の場合は3つのクラスのメンバをstaticインポートする必要がある)、Eclipse等での設定がめんどくさいという問題もありますね。このへんは拡張性とのトレードオフみたいな面もあるので一概にどういうインターフェースがよいのかは言えませんが。
まあ、以前のバージョンと比べてできることが変わっているわけではないのですが、ちょっとこのAPIの変更はどうなんだろうという気がします。