有这么几个问题?
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 ”);