zoukankan      html  css  js  c++  java
  • Quartz.Net进阶之四:CronTrigger 详述

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

            不忘初心,继续努力。

  • 相关阅读:
    Algorithm Gossip (48) 上三角、下三角、对称矩阵
    .Algorithm Gossip (47) 多维矩阵转一维矩阵
    Algorithm Gossip (46) 稀疏矩阵存储
    Algorithm Gossip (45) 费氏搜寻法
    Algorithm Gossip (44) 插补搜寻法
    Algorithm Gossip (43) 二分搜寻法
    Algorithm Gossip (42) 循序搜寻法(使用卫兵)
    Algorithm Gossip (41) 基数排序法
    Algorithm Gossip (40) 合并排序法
    AlgorithmGossip (39) 快速排序法 ( 三 )
  • 原文地址:https://www.cnblogs.com/PatrickLiu/p/10101964.html
Copyright © 2011-2022 走看看