Quartz.NET开源作业调度框架系列(二):CronTrigger

简介: CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则。

  CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则。例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜任,只能选择CronTriggers。利用CronTrigger, 你不但能实现在"每个星期天的晚上12:00"进行备份的任务。还可以执行  "在每个星期一/星期三/星期五的上午9:00到10:00期间每隔5 分钟"进行某个自动化任务。

1 Cron Expressions


  Cron-Expressions 是用户配置实例化的CronTrigger. Cron-Expressions是一个6个或者7个字符的字符串表达式, 每一个字符都表示一个具体的含义并且有取值范围. 每个字符用空格进行分隔,其表达的意义为(从左到右):

1.jpg  一般来说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定义如下:

ITriggertrigger=TriggerBuilder.Create()
.WithIdentity("cronTrigger1", "SimpleGroup")
.WithCronSchedule("0/1 * * * * ?", x=>x    .WithMisfireHandlingInstructionFireAndProceed())
.ForJob("HelloJob", "SimpleGroup")
.Build();

也可以用下面的方法进行定义(注意默认时间不是系统时间-北京时间,所以如果打印出Job第一次打印的时间不是正确的时间,但是好像不影响使用):

//定义jobIJobDetailjob3=JobBuilder.Create<ColorJob>()
.WithIdentity("job3", "group1")
.Build();
//定义cronTriggerICronTriggercronTrigger= (ICronTrigger)TriggerBuilder.Create()
        .WithIdentity("cronTrigger", "group1")
        .WithCronSchedule("0/20 * * * * ?", x=>x        .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))
        .Build();
//默认开始时间DateTimeOffsetscheduleTime3=sched.ScheduleJob(job3, cronTrigger);
//转换到本地时间(北京时间)DateTimeOffsetdt=scheduleTime3.ToLocalTime();////北京时间为默认时间+8小时DateTimeOffsetscheduleTimeChina=scheduleTime3.AddHours(8);
//返回Cron ExpressionstringcronExpression=cronTrigger.CronExpressionString;

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

//排除的日期HolidayCalendarcal=newHolidayCalendar();
DateTimedt排除=newDateTime(2015, 12, 1);
cal.AddExcludedDate(dt排除)
sched.AddCalendar("myHolidayCalendar", cal, false, true);
//定义jobIJobDetailjob3=JobBuilder.Create<ColorJob>()
 .WithIdentity("job3", "group1")
 .Build();
//定义cronTriggerICronTriggercronTrigger= (ICronTrigger)TriggerBuilder.Create()
     .WithIdentity("cronTrigger", "group1")
     .WithCronSchedule("0/20 * * * * ?", x=>x     .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))
     .ModifiedByCalendar("myHolidayCalendar")
     .Build();
//默认开始时间DateTimeOffsetscheduleTime3=sched.ScheduleJob(job3, cronTrigger);
//转换到本地时间(北京时间)//  2015-12-02 00:00:00 +08:00 不包含 2015-12-01DateTimeOffsetdt=scheduleTime3.ToLocalTime();
//北京时间为默认时间+8小时DateTimeOffsetscheduleTimeChina=scheduleTime3.AddHours(8);
//返回Cron ExpressionstringcronExpression=cronTrigger.CronExpressionString;


相关文章
|
5天前
|
C# Windows
.NET开源免费的Windows快速文件搜索和应用程序启动器
今天大姚给大家分享一款.NET开源(MIT License)、免费、功能强大的Windows快速文件搜索和应用程序启动器:Flow Launcher。
|
5天前
|
C#
.NET开源、免费、强大的交互式绘图库
.NET开源、免费、强大的交互式绘图库
|
5天前
|
存储 文字识别 C#
.NET开源免费、功能强大的 Windows 截图录屏神器
今天大姚给大家分享一款.NET开源免费(基于GPL3.0开源协议)、功能强大、简洁灵活的 Windows 截图、录屏、Gif动图制作神器:ShareX。
|
5天前
|
数据可视化 开发工具 C#
.NET开源、免费、跨平台的Git可视化管理工具
俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。今天大姚给大家分享一款.NET Avalonia开源、免费、跨平台、快速的Git可视化管理工具:SourceGit。
|
5天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯?)。
|
5天前
|
小程序 C# 数据库
3个.NET开源、免费、强大的商城系统
今天大姚给大家分享3个.NET开源、免费、强大的商城系统,希望可以帮助到有商城系统开发需求的同学。
|
5天前
|
定位技术 API C#
.NET开源、功能强大、跨平台的图表库
.NET开源、功能强大、跨平台的图表库
|
5天前
|
搜索推荐 API C#
.NET开源快速、强大、免费的电子表格组件
.NET开源快速、强大、免费的电子表格组件
|
5天前
|
人工智能 自然语言处理 算法
分享几个.NET开源的AI和LLM相关项目框架
分享几个.NET开源的AI和LLM相关项目框架
|
5天前
|
C# Windows
一款.NET开源、简洁易用的Windows桌面小说阅读应用
一款.NET开源、简洁易用的Windows桌面小说阅读应用
http://www.vxiaotou.com