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

有这么几个问题?

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 ”);

 

 

 

你可能感兴趣的:(框架,unix,quartz,cron,报表,作业)