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定义如下:
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("cronTrigger1", "SimpleGroup")
.WithCronSchedule("0/1 * * * * ?", x => x
.WithMisfireHandlingInstructionFireAndProceed())
.ForJob("HelloJob", "SimpleGroup")
.Build();
也可以用下面的方法进行定义(注意默认时间不是系统时间-北京时间,所以如果打印出Job第一次打印的时间不是正确的时间,但是好像不影响使用):
//定义job
IJobDetail job3 = JobBuilder.Create<ColorJob>()
.WithIdentity("job3", "group1")
.Build();
//定义cronTrigger
ICronTrigger cronTrigger = (ICronTrigger)TriggerBuilder.Create()
.WithIdentity("cronTrigger", "group1")
.WithCronSchedule("0/20 * * * * ?", x => x
.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))//无效 ?
.Build();
//默认开始时间
DateTimeOffset scheduleTime3 = sched.ScheduleJob(job3, cronTrigger);
//转换到本地时间(北京时间)
DateTimeOffset dt= scheduleTime3.ToLocalTime();//
//北京时间为默认时间+8小时
DateTimeOffset scheduleTimeChina = scheduleTime3.AddHours();
//返回Cron Expression
string cronExpression = cronTrigger.CronExpressionString;
如果在定义的时间规则下,我想排除一些日期,那么如何实现呢?用ModifiedByCalendar即可实现:
//排除的日期
HolidayCalendar cal = new HolidayCalendar();
DateTime dt排除 = new DateTime(, , );
cal.AddExcludedDate(dt排除); sched.AddCalendar("myHolidayCalendar", cal, false, true);
//定义job
IJobDetail job3 = JobBuilder.Create<ColorJob>()
.WithIdentity("job3", "group1")
.Build();
//定义cronTrigger
ICronTrigger cronTrigger = (ICronTrigger)TriggerBuilder.Create()
.WithIdentity("cronTrigger", "group1")
.WithCronSchedule("0/20 * * * * ?", x => x
.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))//无效 ?
.ModifiedByCalendar("myHolidayCalendar")
.Build();
//默认开始时间
DateTimeOffset scheduleTime3 = sched.ScheduleJob(job3, cronTrigger);
//转换到本地时间(北京时间)
// 2015-12-02 00:00:00 +08:00 不包含 2015-12-01
DateTimeOffset dt = scheduleTime3.ToLocalTime();
//北京时间为默认时间+8小时
DateTimeOffset scheduleTimeChina = scheduleTime3.AddHours();
//返回Cron Expression
string cronExpression = cronTrigger.CronExpressionString;
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 是任务调度的元数 ...
随机推荐
- Topology and Geometry in OpenCascade-Edge
Topology and Geometry in OpenCascade-Edge eryar@163.com 摘要Abstract:本文简要介绍了几何造型中的边界表示法(BRep),并结合程序说明O ...
- Unity 游戏存档 PlayerPrefs类的用法
unity3d提供了一个用于本地持久化保存与读取的类--PlayerPrefs.工作原理非常简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值. PlayerPr ...
- 如何在windows 10 x64安装佳能 CP900 驱动
佳能太无耻,为了销售CP910 , CP900 到win8 ,win8.1,win 10 都没有驱动程序,网上找的方法都不行,IT民工自有办法: 1.按住shift键,重启电脑 restart 2.在 ...
- (高德地图)marker定位 bug 解决总结
项目背景: 一个项目bug,项目中用到高德地图,默认打开页面会生成一个marker(下图红色icon),然后用户拖动marker到想要的位置,并且保存. 用户反映定位不准确,在当前页面编辑的位置,到后 ...
- vs切换当前编辑文件时自动定位目录树
在编辑区,切换当前编辑文件时(单击.cpp或.h文件选项卡),"解决方案资源管理器"目录树会自动定位当前编辑的文件,并以灰色标识,当一个解决方案中的工程数目数目很多,每个工程下面又 ...
- WEKA使用(基础配置+垃圾邮件过滤+聚类分析+关联挖掘)
声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的WEKA,实验内容主要有三部分,第一是分类挖掘(垃圾邮件过滤),第二是聚类分析, ...
- asp.net中打印指定控件内容
1.写一个PrintHelper类using System;using System.Data;using System.Configuration;using System.Web;using Sy ...
- Android抓包方法(二)之Tcpdump命令+Wireshark
Android抓包方法(二) 之Tcpdump命令+Wireshark 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等.学会抓包分 ...
- Python 3.0(一) 简介
Python 3.0(一) 简介 [目录] 1.简介 2.python特点 3.安装 简介: Python是可以称得上即简单又功能强大的少有的语言中的一种.你将会惊喜地发现,专注于问题的解决方案而不是 ...
- c# 多线程系列二 自定义线程执行器
看了第一篇文章,多线程系列,看到了在线程执行任务队列有了一定的了解~! 那么今天我来讲讲,怎么样构建通用的自定义线程概念! 线程执行任务,肯定要有目标,但是如果写死了,那么一个线程处理执行职能按照思路 ...