さらに続き…
->More About Triggers
・Calendars
java.util.Calendarクラスではなく、org.quartz.Calendarインタフェース。Triggerのfireに日時等を指定する場合に使用する。org.quartz.impl.HolidayCalendarなんて実装があるらしい。
・Misfire Instructions
たとえば、Schedulerが落ちてしまい、永続化層に保存されたTriggerがfireされなかった場合→ミスfireした時の動作を指示することができる。setMisfireInstruction(..) メソッドで指定できるが、Triggerの種類によって定義されている動作が異なるらしい。
・TriggerUtils
便利らしい
・TriggerListeners
Triggerがfireされたときに呼ばれる
->More About SimpleTrigger
一度だけの実行や、単純な繰り返しの場合に使用する。リピートインターバルが0の場合、リピート回数分のTriggerが同時にfireされる。
あるSimpleTriggerのコンストラクタ
public SimpleTrigger(String name, String group, Date startTime, Date endTime, int repeatCount, long repeatInterval)
SimpleTrigger Example 1 -10秒後に一度だけfireする
long startTime = System.currentTimeMillis() + 10000L; SimpleTrigger trigger = new SimpleTrigger("myTrigger", sched.DEFAULT_GROUP, new Date(startTime), null, 0, 0L);
SimpleTrigger Example 2 -すぐに60秒ごとに無限にfireされる
SimpleTrigger trigger = new SimpleTrigger("myTrigger", sched.DEFAULT_GROUP, new Date(), null, SimpleTrigger.REPEAT_INDEFINITELY, 60L * 1000L);
SimpleTrigger Example 3 -今から40秒間、10秒間隔でfireされる
long endTime = System.currentTimeMillis() + 40000L; SimpleTrigger trigger = new SimpleTrigger("myTrigger", sched.DEFAULT_GROUP, new Date(), new Date(endTime), SimpleTrigger.REPEAT_INDEFINITELY, 10L * 1000L);
SimpleTrigger Example 4 -2002年3月17日10時30分から30秒間隔で5回(初回含め6回)fireされる
java.util.Calendar cal = new java.util.GregorianCalendar(2002, cal.MARCH, 17); cal.set(cal.HOUR, 10); cal.set(cal.MINUTE, 30); cal.set(cal.SECOND, 0); cal.set(cal.MILLISECOND, 0); Data startTime = cal.getTime() SimpleTrigger trigger = new SimpleTrigger("myTrigger", sched.DEFAULT_GROUP, startTime, null, 5, 30L * 1000L);
・SimpleTrigger Misfire Instructions
ミスfireした場合の動作としてSimpleTriggerでは以下が定義されている。
MISFIRE_INSTRUCTION_FIRE_NOW MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT
デフォルトではすべてのTriggerで
Trigger.MISFIRE_INSTRUCTION_SMART_POLICY
が設定される。SimpleTrigger.updateAfterMisfire() がどうだとか…
->More About CronTrigger
SimpleTriggerよりfireのタイミングが細かく設定できる。例えば、毎週月、水、金曜日の午前9時〜10時の間で5分刻みとか。
・Cron Expressions
以下のSub-Expressionsで構成される。
・Seconds ・Minutes ・Hours ・Day-of-Month ・Month ・Day-of-Week
例えば、"0 0 12 ? * WED"は毎週水曜日の午後12時を表す。
それぞれのSub-Expressionsは、ranges and/or listsつまり範囲とリストの単体もしくは、その組み合わせを指定することができる。さっきのWEDには、"MON-FRI", "MON, WED, FRI", または "MON-WED,SAT"が指定できる。
それぞれに指定できる値は以下のとおり。
seconds,minutes:0 to 59 for and , and the values hours:0 to 23 for . Day-of-Month: 0-31→毎月31日までではないので注意 Months:between 0 and 11, or JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC. Days-of-Week:1 and 7 (1 = Sunday) or SUN, MON, TUE, WED, THU, FRI and SAT.
'*'はワイルドカードとして指定できる。Day-of-Weekなら1週間のうちのすべての曜日になる。また、'/'も使用できる。例えば、Minutesに'0/15'を指定したら毎時間15分間隔で0分経過後に開始となる。また'3/20'なら毎時間20分間隔で3分経過後に開始となる。これは'3,23,43'と同じ意味になる。
'?'はday-of-month と day-of-week にだけ指定可能。解説が CronTrigger のJavaDocにあるらしい。後で見てみよう。たぶんこちらを立てればあちらが立たず、みたいなときに使うのだろう(意味不明)。つまり、さっきの例でいくと毎週水曜っていってるんだから、日にちの指定は必要ないでしょ、だから指定なしの'?'を使います!ってことだな。
'L' が day-of-month と day-of-weekに指定できる。'最後'を意味する。つまり、day-of-monthなら月末(1月なら31、2月なら28、閏年の時は当然29)。day-of-week だと単純に'7'または'SAT'。でも"6L" または "FRIL"なんて指定するとその月の最終金曜ってことになるらしい。
CronTrigger Example 1 - 毎時5分間隔
"0 0/5 * * * ?"
CronTrigger Example 2 - 毎時5分間隔+10秒経過後 (例 10:00:10 am, 10:05:10 am, etc.).
"10 0/5 * * * ?"
CronTrigger Example 3 - 毎週水、金曜の10:30, 11:30, 12:30, and 13:30
"0 30 10-13 ? * WED,FRI"
CronTrigger Example 4 - 毎月5、20日の午前8〜9時の30分経過後。つまり8:00, 8:30, 9:00 and 9:30
"0 0/30 8-9 5,20 * ?"
あんまり複雑になるようだったら、Triggerを複数に分けてSchedulerに登録したほうがいいよ、とのこと。そりゃそうだ!