続き…
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を投げる…