CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜任,只能选择CronTriggers.利用CronTrigger, 你不但能实现在"每个星期天的晚上12:00"进行备份的任务,还可以执行 "在每个星期一/星期三/星期五的上午9:00到10:00期间每隔5 分钟"进行某个自动化任务.
1 Cron ExPRessionsCron-Expressions 是用户配置实例化的CronTrigger. Cron-Expressions是一个6个或者7个字符的字符串表达式, 每一个字符都表示一个具体的含义并且有取值范围. 每个字符用空格进行分隔,其表达的意义为(从左到右):
[flash=500,400]http://s1.knowsky.com/20160211/dwfzfeewlng16.jpg[/flash]
一般来说Cron-Expressions 以6位居多,年一般省略.上图的中每个字符的描述为 字符的意义+取值范围(用[])+可用的特殊字符({}).例如 秒[0-59] { , - * /}就代表第一个字符是秒,取值范围是0-59,同时可用的特殊字符为 , - * / 例如"0 15 10 ? * 6L"代表的意义就是每月最后一个星期五的10:15. 下面介绍一下特殊字符的含义:
特殊字符
含义
*
所有值(all values)
?
没有具体的值(no specific value)
-
范围 0-10
,
附加值 1,2,5
L
在不同的字符位置代表的意义不同,"L" 在月天数段代表每月最后一天;如果单独出现在星期段,代表7,就是星期最后一天周六(英文习惯用法).
W
给定日期最近的(周一到周五). 月天数段"15W",表示离每月第15天最近的工作日
#
月份的第多少天,"6#3" 表示月份中第三个星期5(6 = 周五 and "#3" =在月份中第三个).
2 常见的表达式 下面给出一些常见的Cron-Expressions示例:
表达式
含义
0 0 12 * * ?
每天12pm启动
0 15 10 ? * *
每天10:15am启动
0 15 10 * * ?
每天10:15am启动
0 15 10 * * ? *
每天10:15am启动
0 15 10 * * ? 2005
在 2005年每天10:15am启动
0 * 14 * * ?
每天在 2pm到2:59pm之间的每分钟进行启动
0 0/5 14 * * ?
每天在 2pm到2:55pm之间的每5分钟进行启动
0 0/5 14,18 * * ?
每天在 2pm到2:55pm和6pm到6:55pm之间的每5分钟进行启动
0 0-5 14 * * ?
每天在 2pm到2:05pm之间的每分钟进行启动
0 10,44 14 ? 3 WED
每个三月份的星期三的2:10pm到 2:44pm进行启动
0 15 10 ? * MON-FRI
每个星期一到星期五的10:15am进行启动
0 15 10 15 * ?
每个月第15天的10:15am进行启动
0 15 10 L * ?
每个月最后一天的10:15am进行启动
0 15 10 L-2 * ?
每个月第二天到最后一天的10:15am进行启动
0 15 10 ? * 6L
每月最后一个星期五的10:15am进行启动
0/1 * * * * ?
每秒进行启动
0 15 10 ? * 6L 2002-2005
从2002年到2005年的每月最后一个星期五的10:15am进行启动
0 15 10 ? * 6#3
每月第三个星期五的10:15am进行启动
0 0 12 1/5 * ?
从每月第一天开始,每隔5天的12pm进行启动
0 11 11 11 11 ?
每年11月11日的11:11am进行启动
3 CronTrigger示例由上面的常见表达式我们知道表达式 "0/1 * * * * ?"代表了每秒执行 , 其CronTrigger定义如下:
1ITrigger trigger =TriggerBuilder.Create()2.WithIdentity("cronTrigger1","SimpleGroup")3.WithCronSchedule("0/1 * * * * ?", x =>x4.WithMisfireHandlingInstructionFireAndProceed())5.ForJob("HelloJob","SimpleGroup")6.Build();
也可以用下面的方法进行定义(注意默认时间不是系统时间-北京时间,所以如果打印出Job第一次打印的时间不是正确的时间,但是好像不影响使用):
1//定义job2IJobDetail job3 = JobBuilder.Create<ColorJob>()3.WithIdentity("job3","group1")4.Build();5//定义cronTrigger6ICronTrigger cronTrigger =(ICronTrigger)TriggerBuilder.Create()7.WithIdentity("cronTrigger","group1")8.WithCronSchedule("0/20 * * * * ?", x =>x9.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))//无效 ?10.Build();11//默认开始时间12DateTimeOffset scheduleTime3 =sched.ScheduleJob(job3, cronTrigger);13//转换到本地时间(北京时间)14DateTimeOffset dt= scheduleTime3.ToLocalTime();//15//北京时间为默认时间+8小时16DateTimeOffset scheduleTimeChina = scheduleTime3.AddHours(8);17//返回Cron Expression18stringcronExpression = cronTrigger.CronExpressionString;
如果在定义的时间规则下,我想排除一些日期,那么如何实现呢?用ModifiedByCalendar即可实现:
1//排除的日期2HolidayCalendar cal =newHolidayCalendar();3DateTime dt排除 =newDateTime(2015,12,1);4cal.AddExcludedDate(dt排除);56sched.AddCalendar("myHolidayCalendar", cal,false,true);7//定义job8IJobDetail job3 = JobBuilder.Create<ColorJob>()9.WithIdentity("job3","group1")10.Build();11//定义cronTrigger12ICronTrigger cronTrigger =(ICronTrigger)TriggerBuilder.Create()13.WithIdentity("cronTrigger","group1")14.WithCronSchedule("0/20 * * * * ?", x =>x15.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))//无效 ?16.ModifiedByCalendar("myHolidayCalendar")17.Build();18//默认开始时间19DateTimeOffset scheduleTime3 =sched.ScheduleJob(job3, cronTrigger);20//转换到本地时间(北京时间)21//2015-12-02 00:00:00 +08:00 不包含 2015-12-0122DateTimeOffset dt =scheduleTime3.ToLocalTime();23//北京时间为默认时间+8小时24DateTimeOffset scheduleTimeChina = scheduleTime3.AddHours(8);25//返回Cron Expression26stringcronExpression = cronTrigger.CronExpressionString;