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;

时间: 2024-10-09 06:38:47

Quartz.NET开源作业调度框架系列(二):CronTrigger-转的相关文章

Quartz.NET开源作业调度框架系列

Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可用它快捷的创建并执行一个自动化作业.Quartz.NET有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等. 针对Quartz.NET的使用,从基础入门,Cron表达式,不同job间进行参数传递进行了介绍,并对插件任务进行了描述,最后将AdoJobStore如何保持到数据库中进行

Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递-转

前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Contex)进行参数传递 , 有些参数想保存状态该如何处理 . 在Quartz.NET中可以用JobDataMap进行参数传递.本例用Quartz.NET的任务来定期轮询数据库表,当数据库的条目达到一定的数目后,进行预警.(其实可以将读取的表和预警条件配置到数据库中的预警条件表中,这样就可以简单实现一个自动

Quartz.NET开源作业调度框架系列(一):快速入门step by step-转

Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可用它快捷的创建并执行一个自动化作业.Quartz.NET有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等. 1 为什么选择Quartz.NET 在大部分的应用中,都需要对数据库进行定期备份 , 这个备份任务可以是每天晚上12:00或者每周星期二晚上12:00,或许仅仅每个月的最

Quartz.net开源作业调度框架使用详解(转)

前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不用说. 下载项目文档官网:http://www.quartz-scheduler.net/ 项目中需引用:Common.Logging.dll , Common.Logging.Core.dll , Quartz.dll 下面给大家分解下我最近做的关于计划调度的一个小项目,来辅助理解quartz.n

Quartz.net开源作业调度框架使用详解

前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不用说. 下载项目文档官网:http://www.quartz-scheduler.net/ 项目中需引用:Common.Logging.dll , Common.Logging.Core.dll , Quartz.dll 下面给大家分解下我最近做的关于计划调度的一个小项目,来辅助理解quartz.n

Quartz.net开源作业调度

Quartz.net开源作业调度框架使用详解 前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不用说. 下载项目文档官网:http://www.quartz-scheduler.net/ 项目中需引用:Common.Logging.dll , Common.Logging.Core.dll , Quartz.dll 下面给大家分解下我最近做的关于计

.Net平台开源作业调度框架Quartz.Net

Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度.它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等. Quartz.Net的cron表达式: 一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 字段   允许值   允许的

Quartz.NET开源作业调度架构

Quartz.NET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度.它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等. Quick Start 1.项目官网:http://www.quartz-scheduler.net/ 2.建议官网下载压缩包,浏览下源码的大概(里面源码.使

quartz开源作业调度框架的使用

1.官网学习 地址:http://www.quartz-scheduler.org/ 官网上有说明文档及示例,帮助你更好的使用API 2.学习总结 2.1 任务管理(启动,关闭)等操作是依靠调度器Scheduler来管理的,而Scheduler实例是通过工厂Factory获取的,调度器调用了.start()方法,才会让其管理的任务执行 // Grab the Scheduler instance from the Factory Scheduler scheduler = StdSchedule