Quartz基础原理

2018-05-07

Quartz基础原理

1.概念

Quartz是开源的任务调度框架,集合可以应用于任何java程序中,小到独立的小项目,大到规模庞大的电子商务系统.

Quartz可以创建几条/几百条甚至十万条作业调度数

(Quartz的作业环境可以很复杂,精确到每个月最后一个工作日的22:50)

场景:每月自动还款/广告自动上下架/几个小时自动备份云盘等

2.核心组成

Scheduler:调度器。所有的调度都是由它控制。包含两个重要组件

​ JobStore:存储运行时的信息,包括Trigger,Schduler,JobDetail,业务锁等

​ ThreadPool:Quartz自己的线程池实现,所有的任务都有线程池执行

Trigger:触发器.定义触发条件.常用SimpleTrigger/CronTirgger,每隔1秒中执行一次,五种类型

  1. SimpleTrigger
  2. CronTirgger
  3. DateIntervalTrigger
  4. NthIncludedDayTrigger
  5. Calendar 类( org.quartz.Calendar)

常用:

  • SimpleTrigger:用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。
  • CronTrigger:按照日历触发,例如“每个周五”,每个月10日中午或者10:15分。

JobDetail & Job:JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中。

​ 设计成JobDetail+Job是因为任务有可能并发执行的,如果Scheduler直接使用Job,则有可能在同一时刻多个线程同时访问一个Job实例,造成并发访问问题;

​ 而JobDetail&Job的模式下,Scheduler每次使用Job前,JobDetail都会构建一个新的Job,以此来规避并发访问问题

JobDetail和Trigger都有namegroup

​ name是Scheduler中的唯一标识,如果想更新JobDetail或Trigger,只需要重新定义相同的name覆盖即可

​ group是组织单元,使Scheduler可以整组的调度作业

3.核心关系图

核心元素关系图

4.原理(精)传送门:https://xuzhongcn.github.io/

5.使用

5-1 Cron表达式的格式:秒 分 时 日 月 周 年(可选)。

  1. 字段名 允许的值 允许的特殊字符
  2. 秒 0-59 , - * /
  3. 分 0-59 , - * /
  4. 小时 0-23 , - * /
  5. 日 1-31 , - * ? / L W C
  6. 月 1-12 or JAN-DEC , - * /
  7. 周几 1-7 or SUN-SAT , - * ? / L C #
  8. SUN , MON , TUE , WED , THU , FRI and SAT
  9. 年 (可选字段) empty, 1970-2099 , - * /
  • “?”字符:表示不确定的值
  • “,”字符:指定数个值
  • “-”字符:指定一个值的范围
  • “/”字符:指定一个值的增加幅度。
  • n/m表示从n开始,每次增加m
  • “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
  • “W”字符:指定离给定日期最近的工作日(周一到周五)
  • “#”字符:表示该月第几个周X。6#3表示该月第3个周五

Cron表达式示例

  • 每隔5秒执行一次:/5 * ?
  • 每隔1分钟执行一次:0 /1 ?
  • 每天23点执行一次:0 0 23 ?
  • 每天凌晨1点执行一次:0 0 1 ?
  • 每月1号凌晨1点执行一次:0 0 1 1 * ?
  • 每月最后一天23点执行一次:0 0 23 L * ?
  • 每周星期六凌晨1点实行一次:0 0 1 ? * L
  • 在26分、29分、33分执行一次:0 26,29,33 * ?
  • 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 ?