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]);
        }

つーか、これ最初の実行だし実際問題どんな感じのデータがどんな感じで保存されるかまだ全然わかんねーんだからこんなの見せんなや!!と…