quartz

来源:互联网 发布:门口的野蛮人 知乎 编辑:程序博客网 时间:2024/05/18 14:25

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",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)

提示:

  1. 'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发(一般指发工资 );周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.
  2. 周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.

FAQ

怎么执行任务链?或者说怎么创建工作流?

目前还没有直接的或自由的方式通过Quartz链式触发任务。只能通过别的方法来实现:

  1. 使用监听器(TriggerListener,JobListener 或者SchedulerListener),可以通知到某个工作完成,然后可以开始另一个任务。
  2. 创建一个Job,它的JobDataMap 包含下一个Job的名字,当这一个job执行完毕再执行下一个任务。