quartz中的trigger有以下几种(只说部分)
graph TD
Trigger-->MutableTrigger
MutableTrigger-->CalendarIntervalTriggerImpl
MutableTrigger-->CronTriggerImpl
MutableTrigger-->DailyTimeIntervalTriggerImpl
MutableTrigger-->SimpleTriggerImpl-默认
其中创建MutableTrigger是用ScheduleBuilder,代码如下:
public abstract class ScheduleBuilder<T extends Trigger> {
protected abstract MutableTrigger build();
}
MutableTrigger的几种实现类对应的Builder分别是:
- CalendarIntervalScheduleBuilder,
- CronScheduleBuilder,
- DailyTimeIntervalScheduleBuilder,
- SimpleScheduleBuilder
这四个Builder分别创建上图的TriggerImpl。
这些ScheduleBuilder会创建特色化的创建类,而共有信息是放在TriggerBuilder中,
利用TriggerBuilder的new Trigger方法创建利用TriggerBuilder,然后利用withXXX方法加入trigger信息,最后通过withSchedule(ScheduleBuilder)方法选择合适的ScheduleBuilder类去创建不同的trigger。
代码会是:
TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build()
//CronScheduleBuilder.cronSchedule创建CronScheduleBuilder,继而创建CronTriggerImpl
其中TriggerBuilder的部分代码如下:
//withSchedule传入合适的ScheduleBuilder
public <SBT extends T> TriggerBuilder<SBT> withSchedule(ScheduleBuilder<SBT> schedBuilder) {
this.scheduleBuilder = schedBuilder;
return (TriggerBuilder<SBT>) this;
}
//如果传入了ScheduleBuilder则用,不然则用默认的。
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;
}
总结
这样做很好的利用了开闭原则(OCP),如果要扩展Trigger非常容易,也不需要修改代码。如果是:
- TriggerBuilder.newAAAtrigger();
- TriggerBuilder.newBBBtrigger();
- TriggerBuilder.newCCCtrigger();
这样做的话,再增加类型就要修改TriggerBuilder方法,但是利用上面讲述的方法,TriggerBuilder不需要做任何修改。