Quartzソース分析のTrigger

6997 ワード

Triggerはjobの起動時間,失効日,記述,削除の有無などの情報を記録するために用いられる.使用するコード呼び出しは次のとおりです.
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インタフェースが多いです.なぜこのような設計なのかについては、後で一つ一つ分析します.