SchedulerFactory
サンプルプログラム:SchedTestを弄ることにした。
// mainにて schedTest(new org.quartz.impl.StdSchedulerFactory());
まずはSchedulerFactoryを調べてみる。デフォルト実装としてStdSchedulerFactoryが提供されている。ほとんどの場合こいつを使えば事足りる。引数なしコンストラクタを使用した場合は、quartz.propertiesという名前のファイルをクラスパス上で検索し、見つかればそれを読み込んで設定を吸い上げる(utilsのPropertiesParserを使用)。
でもってこんな感じでSchedulerを取得する。
Scheduler sched = sf.getScheduler();
getScheduler()が何しているかって言うと、
1.SchedulerRepository(Schedulerの入れ物:Singleton)のインスタンスを取得
2.プロパティ:org.quartz.scheduler.instanceNameで指定されたSchedulerの
名前(指定がなければ”QuartzScheduler”)を取得
3.SchedulerRepository#lookupを使って名前でSchedulerを検索する
4.Schedulerが登録されていた場合、既にシャットダウンされているか調べ、
もしそうであればSchedulerRepository#removeでリポジトリから削除する(5へ)。
でなければそのまま返す(終了)
5.登録されていない場合はinstantiateでゴリゴリっと設定ファイルの内容を
もとにShcedulerを生成して返す(終了)→生成後リポジトリに登録してる
なんだけど、ソース見た方がわかりやすいなぁ…
public Scheduler getScheduler() throws SchedulerException { if (cfg == null) initialize(); SchedulerRepository schedRep = SchedulerRepository.getInstance(); // 1 Scheduler sched = schedRep.lookup(getSchedulerName()); // 2、3 if (sched != null) { if (sched.isShutdown()) schedRep.remove(getSchedulerName()); // 4 else return sched; // 4 } sched = instantiate(); // 5 return sched; }
getSchduler(String shcedName)は既に登録済みのSchedulerの取得を行う。登録されていなければ当然nullが返ってくる。
でもって何Schedulerが返ってくるかというと、そいつはStdScheduler。こやつは
public StdScheduler(QuartzScheduler sched, SchedulingContext schedCtxt)
となっているように、QuartzSchedulerのプロキシとして動作する。QuartzSchedulerを作るために、QuartzSchedulerResourcesへThreadPoolやらJobStoreなんかを登録してSchedulingContextと一緒に渡してあげる。
public QuartzScheduler(QuartzSchedulerResources resources, SchedulingContext ctxt, long idleWaitTime, long dbRetryInterval)
さらにJobRunShellFactoryなんてのも出てくるんだけど、今そんなにソースを追いかけてると先に進まないし必要になれば調べるでしょ、ってことで先に進もう。
しかーしこれで初期化が終わったわけではなく、このサンプルではこの後前回のTrigger/JobがJDBCJobStore使ってたら残ってるかもしれないから消しましょう、となっている。
String groups = sched.getTriggerGroupNames();
for (int i = 0; i < groups.length; i++) {
String names = sched.getTriggerNames(groups[i]);
for (int j = 0; j < names.length; j++)
sched.unscheduleJob(names[j], groups[i]);
}
groups = sched.getJobGroupNames();
for (int i = 0; i < groups.length; i++) {
String[] names = sched.getJobNames(groups[i]);
for (int j = 0; j < names.length; j++)
sched.deleteJob(names[j], groups[i]);
}
つーか、これ最初の実行だし実際問題どんな感じのデータがどんな感じで保存されるかまだ全然わかんねーんだからこんなの見せんなや!!と…