quartz:job scheduler
背景
目前我们项目任务的调度都是基于linux自身的crontab来实现的,其可以实现大部分周期性任务的需求,但遇到一些特殊的周期性需求—-比如节假日不运行等等这样的任务时,就无能为力,而quartz能够很好的胜任。
quartz是什么?
quartz是一个完全由Java编写的开源调度框架(库),利用它,可以很简单的在java应用程序中进行作业调度,其可以用来创建或调度运行十个,百个,甚至是好几万个Jobs。
能够实现什么样的调度
- 一天中的某个时刻(精确到毫秒)
- 一周中的几天
- 一个月中的几天
- 一年中的几天
- 日历中的特定时间(例如商务假期)
- 重复特定次数
- 不断重复直到特定的时间/日期
- 无限重复
- 延时重复
核心概念
- scheduer:任务调度器
- trigger:触发器,用于定义任务调度时间规则
- job:任务,即被调度的任务
- misfire:错过的,指本来应该被执行但实际没有被执行的任务调度
cron表达式
位置 | 含义 | 允许的特殊字符 |
---|---|---|
1 | 秒(0~59) | , - * / |
2 | 分(0~59) | , - * / |
3 | 小时(0~24) | , - * / |
4 | 日期(1~31) | , - * / ? L W C |
5 | 月(JAN~DEC或1~12) | , - * / |
6 | 星期(SUN~SAT或1~7) | , - * / ? L C # |
7 | 年(可选,1970~2099),若为空,表示全部时间范围 | , - * / |
通配符说明
* 表示所有值,比如在分的字段上设置"*",则表示每分钟都会触发;
? 表示不指定值,比如要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?"
- 表示区间,比如在小时位上设置10-12,则表示10,11,12点都会触发
, 表示指定多个值,比如在周字段上设置"MON,WED,FRI" 表示周一,周三和周五触发
/ 表示递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。
L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则 表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"
W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周 未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触 发。(注,"W"前只能设置具体的数字,不允许区间"-").
# 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)
提示:
'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发(一般指发工资 );周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.
周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.
FAQ
怎么执行任务链?或者说怎么创建工作流?
目前还没有直接的或自由的方式通过Quartz链式触发任务。只能通过别的方法来实现:
- 使用监听器(TriggerListener,JobListener 或者SchedulerListener),可以通知到某个工作完成,然后可以开始另一个任务。
- 创建一个Job,它的JobDataMap 包含下一个Job的名字,当这一个job执行完毕再执行下一个任务。