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

            不忘初心,继续努力。

  • 相关阅读:
    Cocoa中对日期和时间的处理 NSDate
    Fragment(一)--Fragment用法常见问题
    Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析
    # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#
    Android笔记--Bitmap(三) 针对不用Android版本的位图管理
    Java 语言中一个字符占几个字节?
    编码格式
    Volley解析(一)--Volley的使用
    Android笔记--Bitmap(二)内存管理
    Android笔记--Bitmap
  • 原文地址:https://www.cnblogs.com/PatrickLiu/p/10101964.html
Copyright © 2011-2022 走看看