Quartzソース分析のTrigger
Triggerはjobの起動時間,失効日,記述,削除の有無などの情報を記録するために用いられる.使用するコード呼び出しは次のとおりです.
まずTriggerの定義を見てみましょう.
主に、triggerリストから削除するかどうか、実行開始時間、失効日、次回実行時間、前回実行時間などのインタフェース操作を定義します.
TriggerBuilderの論理を見てください.ここではまずnewTrigger()メソッドが呼び出されます.このクラスには次のフィールドがあります.
新Trigger()メソッドは、プライベートTriggerBuilder()コンストラクション関数を呼び出します.上記のパラメータを初期化しました.
withIdentify()メソッドはTriggerKeyクラスを構築し、ユーザーは上のTriggerKeyというフィールドを初期化し、TriggerBuilderクラスを返します.
triggerの起動時間を初期化するためにstartAt()を再度呼び出しました.
最後にbuild()メソッドを呼び出します.
ここには主にMutableTriggerクラスがあり、このクラスはTriggerインタフェースリファレンスに返されます.だからこのクラスはTriggerのサブクラスに違いない.Triggerインタフェースで定義されているフィールドも設定されています.最も重要なのは
SimpleScheduleBuilderクラスの論理を見てみましょう.
ここではSimpleScheduleBuilderオブジェクトを簡単に返します.Triggerオブジェクトを構築するためにbuildメソッドを同時に呼び出します.主なロジックはここにあります.
ここではSimpleTriggerImplオブジェクトを構築し、Triggerインタフェースで要求される2つのプロパティを設定します.ここはTriggerインタフェースが多いです.なぜこのような設計なのかについては、後で一つ一つ分析します.
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger","group1").startAt(runTime).build();
まずTriggerの定義を見てみましょう.
public enum TriggerState { NONE, NORMAL, PAUSED, COMPLETE, ERROR, BLOCKED }
public enum CompletedExecutionInstruction { NOOP, RE_EXECUTE_JOB, SET_TRIGGER_COMPLETE, DELETE_TRIGGER,
public static final int MISFIRE_INSTRUCTION_SMART_POLICY = 0;
public String getDescription();
public String getCalendarName();
public JobDataMap getJobDataMap();
public boolean mayFireAgain();
public Date getStartTime();
public Date getEndTime();
public Date getNextFireTime();
public Date getPreviousFireTime();
主に、triggerリストから削除するかどうか、実行開始時間、失効日、次回実行時間、前回実行時間などのインタフェース操作を定義します.
TriggerBuilderの論理を見てください.ここではまずnewTrigger()メソッドが呼び出されます.このクラスには次のフィールドがあります.
private TriggerKey key;
private String description;
private Date startTime = new Date();
private Date endTime;
private int priority = Trigger.DEFAULT_PRIORITY;
private String calendarName;
private JobKey jobKey;
private JobDataMap jobDataMap = new JobDataMap();
新Trigger()メソッドは、プライベートTriggerBuilder()コンストラクション関数を呼び出します.上記のパラメータを初期化しました.
public static TriggerBuilder<Trigger> newTrigger() {
return new TriggerBuilder<Trigger>();
}
private TriggerBuilder() {}
withIdentify()メソッドはTriggerKeyクラスを構築し、ユーザーは上のTriggerKeyというフィールドを初期化し、TriggerBuilderクラスを返します.
public TriggerBuilder<T> withIdentity(String name, String group) {
key = new TriggerKey(name, group);
return this;
}
triggerの起動時間を初期化するためにstartAt()を再度呼び出しました.
public TriggerBuilder<T> withIdentity(String name, String group) {
key = new TriggerKey(name, group);
return this;
}
最後にbuild()メソッドを呼び出します.
public T build() {
if(scheduleBuilder == null)
scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
MutableTrigger trig = scheduleBuilder.build();
trig.setCalendarName(calendarName);
trig.setDescription(description);
trig.setStartTime(startTime);
trig.setEndTime(endTime);
if(key == null)
key = new TriggerKey(Key.createUniqueName(null), null);
trig.setKey(key);
if(jobKey != null)
trig.setJobKey(jobKey);
trig.setPriority(priority);
if(!jobDataMap.isEmpty())
trig.setJobDataMap(jobDataMap);
return (T) trig;
}
ここには主にMutableTriggerクラスがあり、このクラスはTriggerインタフェースリファレンスに返されます.だからこのクラスはTriggerのサブクラスに違いない.Triggerインタフェースで定義されているフィールドも設定されています.最も重要なのは
scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
MutableTrigger trig = scheduleBuilder.build();
SimpleScheduleBuilderクラスの論理を見てみましょう.
public static SimpleScheduleBuilder simpleSchedule() {
return new SimpleScheduleBuilder();
}
ここではSimpleScheduleBuilderオブジェクトを簡単に返します.Triggerオブジェクトを構築するためにbuildメソッドを同時に呼び出します.主なロジックはここにあります.
public MutableTrigger build() {
SimpleTriggerImpl st = new SimpleTriggerImpl();
st.setRepeatInterval(interval);
st.setRepeatCount(repeatCount);
st.setMisfireInstruction(misfireInstruction);
return st;
}
ここではSimpleTriggerImplオブジェクトを構築し、Triggerインタフェースで要求される2つのプロパティを設定します.ここはTriggerインタフェースが多いです.なぜこのような設計なのかについては、後で一つ一つ分析します.