Quartz.NET(作业调度框架) 学习笔记(三)【Cron 表达式】

来源:互联网 发布:电信4g 的网络制式 编辑:程序博客网 时间:2024/06/07 15:23

有这么几个问题?

1,  每天的2点到6点之间每15分钟对服务器上某个文件夹进行搜索

2,  每周的周5的8点45分对数据库进行备份

3,  每月的最后一天8点创建销售报表

4,  我要在,每个月的15号左右给用户发送邮件,如果是15号是节假日。那么等都来上班的时候在发送。

5,  我要在每个月的第三个周的周5,给每个员工发邮件通知聚餐。

 

像这样复杂的计划,我们怎么办呢,那么CronTrigger触发器就能为我准确的计划

 

先说说CronTrigger触发器的用法

cron 这一观念是来自于 UNIX 世界。在 UNIX 中,cron 是一个运行于后台的守护程序,它负责所有基于时间的事件。尽管 Quartz 除相同的名字和相似的表达式语法外,并未分享到 UNIX cron 别的东西,我们还是值得花几个段落去理解 cron 背后的历史。我们这里的目标不是搞混 UNIX cron 表达式和 Quartz 的 cron 表达式,但是你应该了解 Quartz 表达式的历史,并探索为什么他们运作起来很像

首先说说CronTrigger控制时间的7个域

分,秒,时,天,月,周,年

 

Cron Expression 的格式

比如说第一个问题,每天的2点到6点之间每15分钟对服务器上某个文件夹进行搜索?

对服务器上某个文件夹进行搜索 这是Job所做的事,我们如何来控制Job的执行呢

看看Cron表达式

0  0,15,30,45  2,3,4,5,6  ?  *  *  *

这个在0,15,30,45分域,说明代表在时间分上的执行控制。

“,”: 时间列表之间用

“*”:在分域,月域,周域,年域 代表每天,每月,每周,每年,也就代表任何

“?”:这是一个消除矛盾的符号,解释一下“?“ 因为如果指定了日,在指定周的话,就变的不清楚,不知道是到周几执行 还是那一天执行。所以日和周域,不能同时指定值,又不能为空,只能用?代表其中之一 ?代表不指定值

当然上面的这个表达式可以精简

0  0/15  2-6  ?  *  *

0/15 表示分域 以15分递增 和0,15,30,45是一样的效果

2-6 表示时域从2点到6点每小时执行,就是代表一个区段

在这里没有给年域指定,是因为年域可以为空,其它域都不可以

注:这个表达式执行顺序:2:15 00, 2:30 00,  2:45 00,3:00 00 秒域是0 所以在整分执行 如果秒域我改成15  就变成  2:15 15,2:30 15 ,2:45 15 3:00 15 这样的执

 

看第二个问题

每周的周5的8点45分对数据库进行备份?

当然备份还是Job的工作,Corn表达式只是控制Job的

这个问题Cron表达式

*  45  8  ?  *  6  *

解释一下

“6”在周域上,不代表周六,而代表周5 这个你懂的,当然还可以用English的FRI

看第三个问题

每月的最后一天创建销售报表?

创建销售报表 当然还是Job的工作了

这个问题Cron表达式

0 0 8 L * ?

解释一下

“L” 说明了某域上允许的最后一个值。它仅被日和周域支持。当用在日域上,表示的是在月域上指定的月份的最后一天。

“L” 用在周域上表示周的最后一天 星期6 注意不是星期日

在这表示 每月的最后一天 因为月域上是“*”

0         30  8  ?  *  L  表示每个月的最后一个周六早上8点30执行

在看第四个问题

我要在,每个月的15号左右给用户发送邮件,如果是15号是节假日。那么等都来上班的时候在发送?

发邮件,不用解释你懂的,该什么负责

这里有就有了平日的概念,除了周末和法定假日都是平日

题目要求在节假日的不发送,那么Cron表达式很好啊,刚好有这个一个表达式来支持它

看看:*  *  *  15W  *  ?

解释一下:

“W” 字符代表着平日 (Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。例如,日域中的 15W 意味着 "离该月15号的最近一个平日。" 假如15号是星期六,那么 trigger 会在14号(星期四)触发,因为距15号最近的是星期四

最后一个问题

我要在每个月的第三个周的周5,给每个员工发邮件通知聚餐?

这个很简单,我只是为了说明最后一个符号 “#”

表达式:*  *  * ?  *  6#3

在解释一下

秒域是“*” 所以这个域合法的值 秒域合法的值 你懂的 0-59

分域是“*” 同上 你懂的

时域是 “*” 同上 你懂的

天域“?” 是因为周域有值,避免冲突的

月域“*” 你懂的

周域“6#3” 表示第三周的星期5 (注:6代表周五)

年域空,在所有域中只有年域可以为空。

 

注: 所有域和域之间是用空格隔开。

有了这么多表达式,你想控制JOB 应该很简了。

 

 要试验的话,拿 学习笔记(二)的代码将

 Trigger trigger = TriggerUtils.MakeSecondlyTrigger(2);

改为

CronTrigger trigger = new CronTrigger(“Cron Expression ”);

 

 

 

原创粉丝点击