本文作者:小黑黑

[Quartz.Net]Quartz.Net - 四种触发器

小黑黑 1年前 ( 2019-03-09 ) 551 抢沙发
[Quartz.Net]Quartz.Net - 四种触发器摘要:        Quartz.Net中有4中类型的触发器,正确的使用它们可以有效地帮助我们解决开发中的一些问题,...

       Quartz.Net中有4中类型的触发器,正确的使用它们可以有效地帮助我们解决开发中的一些问题,这4中类型的触发器包括:SimpleTerigger、CalendarIntervalTrigger、DailyTimeIntervalTrigger以及CronTrigger。

一、SimpleTrigger

       SimpleTrigger和Timer类相似。如果你想在特定时刻只执行一次,或者在特定时刻按特定时间间隔重复执行作业。那么推荐使用SimpleTrigger,如你想在今天的20点开始执行,没10分钟执行一次,这样的需求就是使用SimpleTrigger最好的场景。

      使用SimpleTrigger需要有几个点需要注意:

      1、RepeatCount(int count)的次数可以是零,程序会执行count + 1次。

      2、重复间隔必须是TimeSpan.Zero或是正的TimeSpan的值。

      3、当EndAt()和WithRepeatCount()方法同时出现时,最后重复次数还未完成,而结束时间已到,这以结束时间为准。

      4、当时用SimpleScheduleBuilder.RepeatSecondlyForTotalCount(int count)静态方法时,执行次数就是指定的count数,不会+1。

a、在特定时刻执行任务作业,每10秒重复1次

var trigger2 = TriggerBuilder.Create()
                             .StartAt(DateBuilder.TodayAt(20, 0, 0))   //在今天的20点执行,每10秒执行1次
                             .WithSimpleSchedule(x => x.WithIntervalInHours(10)
                                                       .RepeatForever())
                             .Build();
                     
                                        
//类似于WithIntervalInSeconds()方法还有:
//1、WithInterval(TimeSpan timeSpan):需要指定TimeSpan
//2、WithIntervalInMinutes(int minutes):每几分钟执行一次
//3、WithIntervalInHours(int hours):每几个小时执行一次

b、每1秒执行1次,共执行10次

var trigger3 = TriggerBuilder.Create()
                             .WithSimpleSchedule(x => x.WithRepeatCount(10)
                                                       .WithIntervalInSeconds(1))
                             .Build();

      如果使用SimpleSchedulerBuilder的静态方法,这里的次数将会是指定的次数,不在进行 +1

var trigger3 = TriggerBuilder.Create()
                             .WithSchedule(SimpleScheduleBuilder.RepeatSecondlyForTotalCount(3))
                             .Build();
                                
                                
//这里只会执行3次,SimpleScheduleBuilder类中的静态方法其实就是对WithIntervalInSeconds()等方法的封装。
//如:RepeatSecondlyForTotalCount(int count)这个方法里面的内容为:


SimpleScheduleBuilder sb = Create().WithInterval(TimeSpan.FromSeconds(1))
                             .WithRepeatCount(count - 1);

     使用WithRepeatCount()时,如果还是用了EndAt(),那么如果在结束时间内Count次数未执行完,则以结束时间为准:

var trigger3 = TriggerBuilder.Create()
                             .WithSimpleSchedule(x => x.WithRepeatCount(10)
                                                       .WithIntervalInSeconds(1))
                             .EndAt(DateTimeOffset.Now.AddSeconds(3))
                             .Build();

                                
//此时重复执行次数为10次,每一秒执行一次,但结束时间为3秒后执行,此时任务只被执行了4次,secondCount + 1次

c、每五分钟执行一次任务作业,直到20点结束任务作业

var trigger4 = TriggerBuilder.Create()
                             .WithSimpleSchedule(x => x.WithIntervalInMinutes(5)
                                                       .RepeatForever())
                             .EndAt(DateBuilder.TodayAt(20, 0, 0))
                             .Build();

d、构建一个触发器,在下一个整数分钟触发,每1秒执行1次

var trigger5 = TriggerBuilder.Create()
                             .StartAt(DateBuilder.EvenMinuteDateAfterNow())
                             .WithSimpleSchedule(x => x.WithIntervalInSeconds(1)
                                                       .RepeatForever())
                             .Build();

二、CalendarIntervalTrigger

        CalendarIntervalTrigger增加了对日历的扩展,SimpleTrigger只能做到对时分秒的控制,但如果我们有一个特殊的任务,需要在没个月的最后一天执行,那么我们使用SimpleTrigger就无能为力了。这时候使用CalendarIntervalTrigger是一个很好的选择。除了增加对年月日周的扩展,其它方法和SimpleTrigger基本一致。

a、一天执行一次

var trigger1 = TriggerBuilder.Create()
                             .WithCalendarIntervalSchedule(x => x.WithIntervalInDays(1))
                             .Build();

b、一周执行一次

var trigger2 = TriggerBuilder.Create()
                             .WithCalendarIntervalSchedule(X => X.WithIntervalInWeeks(1))
                             .Build();

c、一月执行一次

var trigger3 = TriggerBuilder.Create()
                             .WithCalendarIntervalSchedule(x => x.WithIntervalInMonths(1))
                             .Build();

d、一年执行一次

var trigger4 = TriggerBuilder.Create()
                             .WithCalendarIntervalSchedule(x => x.WithIntervalInYears(1))
                             .Build();

三、DailyTimeIntervalTrigger

        DailyTimeIntervalTrigger触发器能够在一周里特定的星期和给定的时间内按照每秒、每分钟或每小时触发任务。

a、在每天的早8点至晚10点执行任务,每1秒执行一次

var trigger1 = TriggerBuilder.Create()
                             .WithDailyTimeIntervalSchedule(x => x.OnEveryDay()
                             .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 00))
                             .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 00))
                             .WithIntervalInSeconds(1))
                             .Build();

b、在周一到周五的早8点到晚10点执行任务,每30分钟执行一次

var trigger2 = TriggerBuilder.Create()
                             .WithDailyTimeIntervalSchedule(x => x.OnMondayThroughFriday()
                             .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 00))
                             .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 00))
                             .WithIntervalInMinutes(30))
                             .Build();

c、在周六周天的早10点到12点执行任务,每1小时执行1次

var trigger3 = TriggerBuilder.Create()
                             .WithDailyTimeIntervalSchedule(x => x.OnSaturdayAndSunday()
                             .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(10, 00))
                             .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 00))
                             .WithIntervalInHours(1))
                             .Build();

d、在每周一、三、五的12点执行任务,执行一次

var trigger4 = TriggerBuilder.Create()
                             .WithDailyTimeIntervalSchedule(x => x.OnDaysOfTheWeek(new DayOfWeek[3] { 
                                                            DayOfWeek.Monday, 
                                                            DayOfWeek.Sunday, 
                                                            DayOfWeek.Tuesday 
                                                         })
                             .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(12, 00))
                             .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(12, 01))
                             .WithIntervalInHours(1))
                             .Build();

四、CronTrigger

        CronTrigger在实际项目开发中是使用最多的,利用CronTrigger可以实现比较复杂的任务触发规则。同时CronTrigger的触发条件是使用字符串进行配置,这就是我们开发过程中告别了硬编码。

        我们先举例说明,具体的Cron表达式的含义,请参考Cron表达式解析

a、每秒触发一次

var trigger1 = TriggerBuilder.Create()
                              .WithCronSchedule("* * * * * ?")
                              .Build();

b、每5秒触发一次

var trigger2 = TriggerBuilder.Create()
                              .WithCronSchedule("0/5 * * * * ?")
                              .Build();

c、每分钟触发一次

var trigger3 = TriggerBuilder.Create()
                              .WithCronSchedule("0 0/1 * * * ?")
                              .Build();

d、周一到周六的晚上22:00:28开始执行,每1分钟执行一次

var trigger4 = TriggerBuilder.Create()
                              .WithCronSchedule("28 0/1 22 ? * 2-7")
                              .Build();


分享到: 网站分享代码

发表评论

快捷回复:

评论列表 (暂无评论,551人围观)参与讨论

还没有评论,来说两句吧...