続き…

2.Tutorialを読んでみる
 ->More About Jobs & JobDetails

Jobは直接Scheduleにセットできないため、JobDetailsに格納して渡す。JobDetailsにはJobの名前/グループ等の情報を設定する。Jobの再利用のために分けてるのかな…。JobDetailsにはJobのClassを渡し、Schedulerはexecuteの前にJobのインスタンスを生成するらしい。なのでJobにはデフォルトコンストラクタが必要。ってことでデータメンバは定義してもしょうがない。

では困るので、Jobのプロパティとかexecute間のステータスの保持はJobDataMapを使って行う。んで、そいつはJobDetailsに設定しましょうと。例えば、以下のような感じ(SchedulerにJobを追加する前に行う)

 jobDetail.getJobDataMap().put("jobSays", "Hello World!");
  jobDetail.getJobDataMap().put("myFloatValue", 3.141f);
  jobDetail.getJobDataMap().put("myStateData", new ArrayList());

んで、Jobからはこんな感じで呼ぶ。

 public class DumbJob implements Job {

    public DumbJob() {
    }

    public void execute(JobExecutionContext context)
      throws JobExecutionException
    {
      String instName = context.getJobDetail().getName();
      String instGroup = context.getJobDetail().getGroup();

      JobDataMap dataMap = context.getJobDetail().getJobDataMap();

      String jobSays = dataMap.getString("jobSays");
      float myFloatValue = dataMap.getFloat("myFloatValue");
      ArrayList state = (ArrayList)dataMap.get("myStateData");
      state.add(new Date());

      System.err.println("Instance " + instName + " of DumbJob says: " + jobSays);
    }
  }

ここで、JobStore(Jobの永続化層への保存)を使う場合にJobDataMapの保存に気をつけないとクラスのバージョンで問題が発生する場合があるらしい。ってことでStringとprimitiveだけを格納するようにしなさいと。

 ->Stateful vs. Non-Stateful Jobs
execute間でJobDataMapを引き継ぎたいのならStatefulなJobを使用する。StatefulなJobというのは、JobインタフェースではなくStatefulJobインタフェースを実装したJobのこと。この場合、Jobの同時実行は行われず、先に実行されているexecuteの終了を待って、次のexecuteが実行される。

 ->Other Attributes Of Jobs
後は以下のような設定があるらしい。
 ・Durability:falseに設定された場合、適用されるToriggerがなくなった場合に自動的にSchedulerから削除される
 ・Volatility:trueの場合、Schdulerの再スタート時には存在しない
 ・RequestsRecovery:実行中にプロセスなりハードなりが落ちたときに再度Suchedulerがスタートしたときに再実行するかどうかの設定
 ・JobListeners:Jobが実行された際のイベントが通知されるJobListenerとやらが0個以上設定できる

 ->The Job.execute(..) Method
何かあったらJobExecutionExceptionを投げる…