2018-05-07
Quartz基础原理
1.概念
Quartz是开源的任务调度框架,集合可以应用于任何java程序中,小到独立的小项目,大到规模庞大的电子商务系统.
Quartz可以创建几条/几百条甚至十万条作业调度数
(Quartz的作业环境可以很复杂,精确到每个月最后一个工作日的22:50)
场景:每月自动还款/广告自动上下架/几个小时自动备份云盘等
2.核心组成
Scheduler:调度器。所有的调度都是由它控制。包含两个重要组件
JobStore:存储运行时的信息,包括Trigger,Schduler,JobDetail,业务锁等
ThreadPool:Quartz自己的线程池实现,所有的任务都有线程池执行
Trigger:触发器.定义触发条件.常用SimpleTrigger/CronTirgger,每隔1秒中执行一次,五种类型
- SimpleTrigger
- CronTirgger
- DateIntervalTrigger
- NthIncludedDayTrigger
- 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都有name和group。
name是Scheduler中的唯一标识,如果想更新JobDetail或Trigger,只需要重新定义相同的name覆盖即可
group是组织单元,使Scheduler可以整组的调度作业
3.核心关系图
4.原理(精)传送门:https://xuzhongcn.github.io/
5.使用
5-1 Cron表达式的格式:秒 分 时 日 月 周 年(可选)。
- 字段名 允许的值 允许的特殊字符
- 秒 0-59 , - * /
- 分 0-59 , - * /
- 小时 0-23 , - * /
- 日 1-31 , - * ? / L W C
- 月 1-12 or JAN-DEC , - * /
- 周几 1-7 or SUN-SAT , - * ? / L C #
- SUN , MON , TUE , WED , THU , FRI and SAT
- 年 (可选字段) 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 ?