Cron-Expressions被用于配置CronTrigger实例。Cron-Expressions是一串字符串。由七个部分组成,用来详细描述时间调度。各个部分内容用空" />
您的位置:时时app平台注册网站 > 编程知识 > Quartz.net官方开发指南 第六课 : CronTrigger【时时

Quartz.net官方开发指南 第六课 : CronTrigger【时时

2019-11-28 03:22

Cron Expressions

style="font-family: 'Microsoft YaHei'; font-size: 16px;">Cron-Expressions被用于配置CronTrigger实例。Cron-Expressions是一串字符串。由七个部分组成,用来详细描述时间调度。各个部分内容用空格分开,各部分表示如下:

  1. style="font-family: 'Microsoft YaHei'; font-size: 16px;">Seconds
  2. style="font-family: 'Microsoft YaHei'; font-size: 16px;">Minutes
  3. style="font-family: 'Microsoft YaHei'; font-size: 16px;">Hours
  4. style="font-family: 'Microsoft YaHei'; font-size: 16px;">Day-of-Month
  5. style="font-family: 'Microsoft YaHei'; font-size: 16px;">Month
  6. style="font-family: 'Microsoft YaHei'; font-size: 16px;">Day-of-Week
  7. style="font-family: 'Microsoft YaHei'; font-size: 16px;">Year (optional field

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">用一个简单的例子说明:“0 0 12 ? * WED”。这段字符串表达的意思是每个星期二的12:00.

    style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">个别的sub-expressions可以包含一个范围组合。例如:day of week 字段,在之前的例子中可以写成“MON-FRI”,“MON,WED,FRI”或者是“MON,WED,SAT”。

    style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">各部分使用通配符来表示这个字段所有的可能值意思显而易见在Month字段上表示所有月份,在day of week表示每个周的所有天数。

    style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">每个字段都有自己的值限定。这些限定值得范围是相当明显-在分钟和秒的字段上范围是0-59。在Hours字段上范围为0-23。在day of month 字段上范围是0-31但是这需要依据具体的月份来计算。Month的有效值为0-11.。当然也可以使用JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC。day of week 有效范围是1-7(表示星期日)也可以使用SUN, MON, TUE, WED, THU, FRI and SAT.表示。

    style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">‘/’用来表示一个特殊的增长间隔。例如在Minutes字段上写入0/15,表示的意思是每15执行,在0分钟的时候启动。如果写的3/20则表示每20分钟执行一次,在3分钟钟后启动,其工作的时间是3,23,43.

    style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">‘?’可以用在 day-of-month and day-of-week字段上面。用来表示没有具体值得意思。如果你需要在这两个字段做一些特殊的操作这个符号是非常有用的,详情请看CronTrigger API documentation。

    style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">‘L’容许用在day-of-month and day-of-week 字段上面。这个字符在两个字段上面表示的意思不太一样。例如:在day-of-month上表示是这个月的最后的一天。如果使用在day-of-week表示的7(SAT)。如果在L前面带有其它具体值,则表示某个月的最后的某一天。例如6L或者FRIL表示的是该月的最后一个星期5.当你使用L的时候,你需要知道它不会指定一个特殊的具体指或者一个范围,而是一个不确定的值。

    style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">‘W’表示的是最接近给定天的工作日(星期一到星期五)。例如你写是15W在day-of-month则表示最接近该月15的工作日。

    style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">“#”被用来指定该月的“第n”XXX工作日。例如,设置值“6#3”或者“FRI#3”在day-of-week,则表示这个月的第三个星期五”。

下面是一些表达式以及它们的含义。

Building CronTriggers

style="font-family: 'Microsoft YaHei'; font-size: 16px;">构建CronTrigger具体实例,使用的是TriggerBuilder (用来配置Trigger主要的内容)和WithCronSchedule(用来配置Trigger的特殊需要内容) 扩展方法。

 

style="font-size: 16px;">1、创建一个每天的8-17点之间每两分钟执行一次

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

2、构建一个每天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();

或者

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

style="font-size: 16px;">3、构建一个每个星期二的10:42,使用非系统默认的时区

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();

或者

1 trigger = TriggerBuilder.Create()
2     .WithIdentity("trigger3", "group1")
3     .WithCronSchedule("0 42 10 ? * WED", x => x
4         .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
5     .ForJob(myJobKey)
6     .Build();

"0 0/5 * * * ?" CronTrigger

style="font-family: 'Microsoft YaHei'; font-size: 16px;">CronTriggers使用的频率比SimpleTrigger跟高。如果需要schedule 中触发Job的方式类似于日历的形式而不是一个确定的是时间间隔,那就需要使用CronTrigger。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">对于CronTrigger,你可以触发Schedule,例如每个周五中午或者每个工作日的下午9:30或者在早上9:00至10:;之间每五分钟执行一次在每个周一、周二、周五执行。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">不紧如此,SampleTrigger和CronTriggerd都有一个启动时间和一个可选的结束时间来停止。

  6. Day-of-Week 周中的天

CronTrigger Misfire Instructions

style="font-family: 'Microsoft YaHei'; font-size: 16px;">下面的是CronTrigger MisFire(失败之后执行的策略)。详情见 API documentation

  • style="font-family: 'Microsoft YaHei'; font-size: 16px;">MisfireInstruction.IgnoreMisfirePolicy
  • style="font-family: 'Microsoft YaHei'; font-size: 16px;">MisfireInstruction.CronTrigger.DoNothing
  • style="font-family: 'Microsoft YaHei'; font-size: 16px;">MisfireInstruction.CronTrigger.FireOnceNow

    style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">所有触发器有可使用的MisfireInstrution.SmartPolicy指令,并且该指令也是所有触发类型的默认。在“明智的政策”指令被CronTrigger解释为MisfireInstruction.CronTrigger.FireOnceNow。对于CronTrigger.UpdateAfterMisfire()方法的API文档解释了这种行为的具体细节。

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">当建立CronTriggers,您指定的misfire 作为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();

 

 

Cron Expressions——Cron 表达式

Example Cron Expressions

style="font-family: 'Microsoft YaHei'; font-size: 16px;">下面给出一些具体表达式例子,更具体的介绍见the API documentation for CronTrigger。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">1、每五分钟执行一次

"0 0/5 * * * ?"

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">2、每五分钟执行一次,十秒等待

"10 0/5 * * * ?"   10:00:10  10:05:10

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">3、每周一和周五的10:30 11:30 12:30 13:30执行一次

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

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">4、每月的5号与20号的8-9点之间每30分钟执行一次

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

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">注意:有些触发机制过于复杂,例如每五分钟执行一次在每月的8-9点,并且在13至22点没20分钟执行一次,对于这样的触发记住,可以装件两个单独的触发器来工作相同的内容。

 

所有的域中的值都有特定的合法范围,这些值的合法范围相当明显,例如:秒和分域的合法值为0到59,小时的合法范围是0到23,Day-of-Month中值得合法凡范围是0到31,但是需要注意不同的月份中的天数不同。月份的合法值是0到11。或者用字符串JAN,FEB MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 及DEC来表示。Days-of-Week可以用1到7来表示(1=星期日)或者用字符串SUN, MON, TUE, WED, THU, FRI 和SAT来表示.

'?'字符可以用在day-of-month及day-of-week域中,它用来表示“没有指定值”。这对于需要指定一个或者两个域的值而不需要对其他域进行设置来说相当有用。

  7. Year (optional field) 年(可选的域)

'#'表示表示月中的第几个周几。例如:day-of-week域中的"6#3" 或者 "FRI#3"表示“月中第三个周五”。

  5. Month 月

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

如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用。

'/'字符用来表示值的增量,例如, 如果分钟域中放入'0/15',它表示“每隔15分钟,从0开始”,如果在份中域中使用'3/20',则表示“小时中每隔20分钟,从第3分钟开始”或者另外相同的形式就是'3,23,43'。

  3. Hours 小时

例4 – 在每个月的5号,20号的8点和10点之间每隔半个小时触发一次且不包括10点,只是8:30,9:00和9:30的表达式。

例3 – 在每个周三和周五的10:30,11:30,12:30触发的表达式。

  4. Day-of-Month 月中的天

单个子表达式可以包含范围或者列表。例如:前面例子中的周中的天这个域(这里是"WED")可以被替换为"MON-FRI", "MON, WED, FRI"或者甚至"MON-WED,SAT"。

'W' 字符用来指定距离给定日最接近的周几(在day-of-week域中指定)。例如:如果你为day-of-month域指定为"15W",则表示“距离月中15号最近的周几”。

Quartz Cron 表达式(时间格式的写法)

例1 – 一个简单的每隔5分钟触发一次的表达式

"0 0/30 8-9 5,20 * ?" 注意,对于单独触发器来说,有些日程需求可能过于复杂而不能用表达式表述,例如:9:00到10:00之间每隔5分钟触发一次,下午1:00到10点每隔20分钟触发一次。这个解决方案就是创建两个触发器,两个触发器都运行相同的任务。

CronTrigger

使用CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。甚至,象SimpleTrigger一样,CronTrigger也有一个StartTime以指定日程从什么时候开始,也有一个(可选的)EndTime以指定何时日程不再继续。

通配符('*')可以被用来表示域中“每个”可能的值。因此在"Month"域中的*表示每个月,而在Day-Of-Week域中的*则表示“周中的每一天”。

  2. Minutes 分钟

Example Cron Expressions ——Cron表达式的例子

Cron表达式被用来配置CronTrigger实例。Cron表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:

  1. Seconds 秒

"10 0/5 * * * ?" CronTrigger

 例2 – 在每分钟的10秒后每隔5分钟触发一次的表达式(例如. 10:00:10 am, 10:05:10等.)。

 

一个cron表达式的例子字符串为"0 0 12 ? WED"*,这表示“每周三的中午12:00”。

'L'字符可以在day-of-month及day-of-week中使用,这个字符是"last"的简写,但是在两个域中的意义不同。例如,在day-of-month域中的"L"表示这个月的最后一天,即,一月的31日,非闰年的二月的28日。如果它用在day-of-week中,则表示"7"或者"SAT"。但是如果在day-of-week域中,这个字符跟在别的值后面,则表示"当月的最后的周XXX"。例如:"6L" 或者 "FRIL"都表示本月的最后一个周五。当使用'L'选项时,最重要的是不要指定列表或者值范围,否则会导致混乱。

本文由时时app平台注册网站发布于编程知识,转载请注明出处:Quartz.net官方开发指南 第六课 : CronTrigger【时时

关键词: