Quartz.NET开源作业调度框架系列(二):CronTrigger-转
CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜任,只能选择CronTriggers.利用CronTrigger, 你不但能实现在"每个星期天的晚上12:00"进行备份的任务,还可以执行 "在每个星期一/星期三/星期五的上午9:00到10:00期间每隔5 分钟"进行某个自动化任务.
1 Cron Expressions
Cron-Expressions 是用户配置实例化的CronTrigger. Cron-Expressions是一个6个或者7个字符的字符串表达式, 每一个字符都表示一个具体的含义并且有取值范围. 每个字符用空格进行分隔,其表达的意义为(从左到右):
  
一般来说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定义如下:
1 ITrigger trigger = TriggerBuilder.Create()
2 .WithIdentity("cronTrigger1", "SimpleGroup")
3 .WithCronSchedule("0/1 * * * * ?", x => x
4 .WithMisfireHandlingInstructionFireAndProceed())
5 .ForJob("HelloJob", "SimpleGroup")
6 .Build();
也可以用下面的方法进行定义(注意默认时间不是系统时间-北京时间,所以如果打印出Job第一次打印的时间不是正确的时间,但是好像不影响使用):

1 //定义job
2 IJobDetail job3 = JobBuilder.Create<ColorJob>()
3 .WithIdentity("job3", "group1")
4 .Build();
5 //定义cronTrigger
6 ICronTrigger cronTrigger = (ICronTrigger)TriggerBuilder.Create()
7 .WithIdentity("cronTrigger", "group1")
8 .WithCronSchedule("0/20 * * * * ?", x => x
9 .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))//无效 ?
10 .Build();
11 //默认开始时间
12 DateTimeOffset scheduleTime3 = sched.ScheduleJob(job3, cronTrigger);
13 //转换到本地时间(北京时间)
14 DateTimeOffset dt= scheduleTime3.ToLocalTime();//
15 //北京时间为默认时间+8小时
16 DateTimeOffset scheduleTimeChina = scheduleTime3.AddHours(8);
17 //返回Cron Expression
18 string cronExpression = cronTrigger.CronExpressionString;

如果在定义的时间规则下,我想排除一些日期,那么如何实现呢?用ModifiedByCalendar即可实现:

1 //排除的日期
2 HolidayCalendar cal = new HolidayCalendar();
3 DateTime dt排除 = new DateTime(2015, 12, 1);
4 cal.AddExcludedDate(dt排除);
5
6 sched.AddCalendar("myHolidayCalendar", cal, false, true);
7 //定义job
8 IJobDetail job3 = JobBuilder.Create<ColorJob>()
9 .WithIdentity("job3", "group1")
10 .Build();
11 //定义cronTrigger
12 ICronTrigger cronTrigger = (ICronTrigger)TriggerBuilder.Create()
13 .WithIdentity("cronTrigger", "group1")
14 .WithCronSchedule("0/20 * * * * ?", x => x
15 .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))//无效 ?
16 .ModifiedByCalendar("myHolidayCalendar")
17 .Build();
18 //默认开始时间
19 DateTimeOffset scheduleTime3 = sched.ScheduleJob(job3, cronTrigger);
20 //转换到本地时间(北京时间)
21 // 2015-12-02 00:00:00 +08:00 不包含 2015-12-01
22 DateTimeOffset dt = scheduleTime3.ToLocalTime();
23 //北京时间为默认时间+8小时
24 DateTimeOffset scheduleTimeChina = scheduleTime3.AddHours(8);
25 //返回Cron Expression
26 string cronExpression = cronTrigger.CronExpressionString;

出处:http://www.cnblogs.com/isaboy/
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Quartz.NET开源作业调度框架系列(二):CronTrigger-转的更多相关文章
- Quartz.NET开源作业调度框架系列(二):CronTrigger
		CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ... 
- Quartz.NET开源作业调度框架系列
		Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ... 
- Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递
		前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Conte ... 
- Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递-转
		前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Conte ... 
- Quartz.NET开源作业调度框架系列(一):快速入门step by step
		Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ... 
- Quartz.NET开源作业调度框架系列(一):快速入门step by step-转
		Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ... 
- Quartz.NET开源作业调度框架系列(四):Plugin Job
		如果在Quartz.NET作业运行时我们想动态修改Job和Trigger的绑定关系,同时修改一些参数那么该怎么办呢?Quartz.NET提供了插件技术,可以通过在XML文件中对Job和Trigger的 ... 
- Quartz.NET开源作业调度框架系列(四):Plugin Job-转
		如果在Quartz.NET作业运行时我们想动态修改Job和Trigger的绑定关系,同时修改一些参数那么该怎么办呢?Quartz.NET提供了插件技术,可以通过在XML文件中对Job和Trigger的 ... 
- Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库
		Quartz.NET 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger(用于定义调度时间的元素,即按照什么时间规则去执行任务) 和 job 是任务调度的元数 ... 
随机推荐
- Java常见异常(Runtime Exception )小结(转)
			原文链接:Java常见异常(Runtime Exception )小结 Java异常体系结构呈树状,其层次结构图如图 1所示: 本文重在Java中异常机制的一些概念.写本文的目的在 ... 
- RateLimiter
			RateLimiter是Guava的concurrent包下的一个用于限制访问频率的类. 限流算法 常用的更平滑的限流算法有两种:漏桶算法和令牌桶算法. 很多传统的服务提供商如华为中兴都有类似的专利, ... 
- matlib实现梯度下降法
			样本文件下载:ex2Data.zip ex2x.dat文件中是一些2-8岁孩子的年龄. ex2y.dat文件中是这些孩子相对应的体重. 我们尝试用批量梯度下降法,随机梯度下降法和小批量梯度下降法来对这 ... 
- 在linux机器上面安装anaconda和相关软件
			直接安装anaconda参考这里,主要两条命令: wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh bash ... 
- CentOS6.4下安装Chrome
			因为蛋疼的glibc问题,(我就纳闷了,为何CentOS支持的glibc的版本就那么低呢,害得我至今还没把genymotion安装上), Chrome浏览器一直没安装上,不过终于找到了解决方案,安装派 ... 
- Remote Desktop Session中如何触发Ctrl+Alt+Delete?
			Ctrl+Alt+End is a keyboard shortcut used in a Remote Desktop Session to display the security dialog ... 
- Jetpack 架构组件 Lifecycle 生命周期 MD
			Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ... 
- 微信小程序显示html格式内容(wxParse使用及循环解析数据渲染)
			小程序默认是不支持html格式的内容显示的,那我们需要显示html内容的时候,就可以通过wxParse来实现. 首先我们下载wxParse,github地址:https://github.com/ic ... 
- cdn网络加速
			CDN全称Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过在网络各处放置节点服 ... 
- zookeeper基础知识整理
			http://blog.csdn.net/pelick/article/details/7269670 http://zookeeper.apache.org/doc/trunk/javaExampl ... 
