以前都是将所有的内容放在一篇文章里,就会导致文章很长,对于学习的人来说,有时候这也是一个障碍。所以,以后我的写作习惯,我就会把我写的文章缩短,但是内容不会少,内容更集中。这样,学习起来也不会很累,很容易看完,也能记得住,不用记得那么多不相关的东西,学习效率也会越高。好了,开始今天的学习计划吧,今天我们要介绍的对象就是 CronTrigger。

    一、CronTrigger 对象概述

        如果您需要一个基于类似日历的概念而不是基于SimpleTrigger的指定确切间隔来重复的触发执行作业计划,那么CronTrigger通常比SimpleTrigger更有用。
        
        使用CronTrigger,您可以指定诸如“每个星期五中午”或“每个工作日早上9:30”,甚至“每个星期一、星期三和星期五上午9:00至10:00之间的每5分钟”的触发时间表。
        即便如此,像SimpleTrigger一样,CronTrigger也有一个startTime属性,用于指定计划何时生效,以及一个(可选的)endTime属性,用于指定何时停止计划。

    二、Cron表达式

        Cron-Expressions用于配置CronTrigger的实例。 Cron-Expressions是实际上由七个子表达式组成的字符串,用于描述计划的各个细节。 这些子表达式用空格分隔,表示:

        1.Seconds

        1.Minutes

                1.Hours

                1.Day-of-Month

                1.Month

                1.Day-of-Week

                1.Year (optional field)

        完整的cron表达式的一个例子是字符串“0 0 12? * WED“ - 表示”每周三中午12点“。

        单个子表达式可以包含范围和/或列表。例如,前一个示例(读作“WED”)中的星期日字段可以用“MON-FRI”、“MON,WED,FRI”甚至“MON-WED,SAT”替换。

        通配符(''字符)可用于表示该字段的“每个”可能值。 因此,前一个例子的“月”字段中的''字符仅表示“每个月”。 周日字段中的'*'显然意味着“一周中的每一天”。

        所有字段都有一组可以指定的有效值。这些值应该是相当明显的,比如数字0到59表示秒和分钟,数值0到23表示小时。每月的日期可以是0-31的任何值,但您需要注意一个月内的天数!月份可以指定为0到11之间的值,或者使用字符串JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV和DEC。星期几可以指定为1到7之间的值(1 =星期日)或使用字符串SUN,MON,TUE,WED,THU,FRI和SAT。

        '/'字符可用于指定值的增量。 例如,如果在“分钟”字段中输入“0/15”,则表示“每隔15分钟,从零分钟开始”。 如果您在“分钟”字段中使用“3/20”,则表示“每小时每20分钟一次,从第3分钟开始” - 或者换句话说,它与在“分钟”中指定“3,23,43”相同。

        “?”字符允许用于日期和星期字段。 它用于指定“无特定值”。 当您需要在两个字段之一中指定某些内容而不是另一个字段时,这非常有用。 请参阅下面的示例(和CronTrigger API文档)以获得说明。

        “L”字符允许用于日期和星期字段。 这个字符是“last”的简写,但它在两个字段的中具有不同的含义。 例如,日期字段中的“L”值表示“月份的最后一天” -  1月31日,非闰年2月28日。 如果在星期字段中单独使用,则仅表示“7”或“SAT”。如果在星期字段中在另一个值后使用了“L”,则表示“该月的最后一个xxx日” - 例如“6L”或“FRIL”均表示“该月的最后一个星期五”。 使用“L”选项时,重要的是不要指定列表或值范围,因为您得到的结果并不是你想要的。

        'W'用于指定最接近给定日期的工作日(周一至周五)。 例如,如果您指定“15W”作为日期字段的值,则含义为:“最接近的工作日到该月的15日”。

        ‘#’这个词是用来指定这个月的“第n个”XXX工作日。例如,星期几字段中的“6#3”或“FRI#3”的值表示“本月的第三个星期五”。


    三、示例 Cron 表达式

        以下是表达式及其含义的更多示例 - 您可以在CronTrigger的API文档中找到更多

        CronTrigger示例1  - 用于创建触发器的表达式,该触发器每5分钟触发一次

            "0 0/5 * * * ?"

        CronTrigger示例2  - 用于创建触发器的表达式,该触发器在每分钟10秒后(即上午10:00:10,上午10:05:10等)每5分钟触发一次。

            "10 0/5 * * * ?"

        CronTrigger示例3  - 用于创建触发器的表达式,该触发器在每周三和周五的10:30,11:30,12:30和13:30触发。

            "0 30 10-13 ? * WED,FRI"

        CronTrigger示例4  - 用于创建触发器的表达式,该触发器在每个月的5日和20日上午8点到上午10点之间每半小时触发一次。 请注意,触发器不会在上午10:00,即8:00,8:30,9:00和9:30触发

            "0 0/30 8-9 5,20 * ?"

        请注意,某些计划要求过于复杂,无法通过单个触发器表达 - 例如“上午9:00至上午10:00之间每隔5分钟,下午1:00至晚上10:00之间每20分钟”。 此方案中的解决方案是创建两个触发器,并注册它们以运行相同的作业。
        

    四、建立CronTriggers

        CronTrigger实例是使用TriggerBuilder(用于触发器的主要属性)和WithCronSchedule扩展方法(用于特定于CronTrigger的属性)构建的。

        您还可以使用CronScheduleBuilder的静态方法来创建计划。

        建立一个触发器,每天上午8点到下午5点之间每隔一分钟触发一次:

1             trigger = TriggerBuilder.Create()
2                 .WithIdentity("trigger3", "group1")
3                 .WithCronSchedule("0 0/2 8-17 * * ?")
4                 .ForJob("myJob", "group1")
5                 .Build();


        构建一个触发器,每天上午10:42触发:

 1             // we use CronScheduleBuilder's static helper methods here
 2             trigger = TriggerBuilder.Create()
 3                 .WithIdentity("trigger3", "group1")
 4                 .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 42))
 5                 .ForJob(myJobKey)
 6                 .Build();
 7             
 8             或者
 9 
10             trigger = TriggerBuilder.Create()
11                 .WithIdentity("trigger3", "group1")
12                 .WithCronSchedule("0 42 10 * * ?")
13                 .ForJob("myJob", "group1")
14                 .Build();


        构建一个触发器,该触发器将在星期三上午10点42分在TimeZone中触发,而不是系统的默认值:

 1             trigger = TriggerBuilder.Create()
 2                 .WithIdentity("trigger3", "group1")
 3                 .WithSchedule(CronScheduleBuilder
 4                     .WeeklyOnDayAndHourAndMinute(DayOfWeek.Wednesday, 10, 42)
 5                     .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
 6                 .ForJob(myJobKey)
 7                 .Build();
 8 
 9             或者
10 
11             trigger = TriggerBuilder.Create()
12                 .WithIdentity("trigger3", "group1")
13                 .WithCronSchedule("0 42 10 ? * WED", x => x
14                     .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
15                 .ForJob(myJobKey)
16                 .Build();



    五、CronTrigger Misfire 说明

        以下说明可用于告知Quartz当CronTrigger发生失效时它应该做什么。 (在本教程的“更多关于触发器”部分中介绍了失效情况)。 这些指令以常量定义(并且API文档具有对其行为的描述)。 说明包括:

            
            MisfireInstruction.IgnoreMisfirePolicy

            MisfireInstruction.CronTrigger.DoNothing

            MisfireInstruction.CronTrigger.FireOnceNow

        所有触发器都可以使用MisfireInstrution.SmartPolicy指令,该指令也是所有触发器类型的默认指令。 CronTrigger将“smart policy”指令解释为MisfireInstruction.CronTrigger.FireOnceNow。 CronTrigger.UpdateAfterMisfire()方法的API文档解释了此行为的确切详细信息。

        在构建CronTriggers时,您将失效指令指定为cron调度的一部分(通过WithCronSchedule扩展方法):

1             trigger = TriggerBuilder.Create()
2                 .WithIdentity("trigger3", "group1")
3                 .WithCronSchedule("0 0/2 8-17 * * ?", x => x
4                     .WithMisfireHandlingInstructionFireAndProceed())
5                 .ForJob("myJob", "group1")
6                 .Build();



    六、总结

          今天要写的内容差不多了,由于个人的翻译水平有限,可能存在不正确的地方,为了让大家可以看到原文,这样可以有个更好的理解,我也把原地址贴出来。原文地址如下:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/crontriggers.html

        不忘初心,继续努力。

posted on 2018-12-11 14:22  可均可可  阅读(2002)  评论(0编辑  收藏  举报