代码技巧-OCP(开闭原则)-quartz创建trigger

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不需要做任何修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值