Quartz学习--quartz基本介绍和Cron表达式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Quartz学习--quartz基本介绍和Cron表达式
表名称说明
qrtz_blob_triggers Trigger作为Blob类型存储(⽤于Quartz⽤户⽤JDBC创建他们⾃⼰定制的Trigger类型,JobStore 并不知道如何存储实例的时候)
qrtz_calendars以Blob类型存储Quartz的Calendar⽇历信息, quartz可配置⼀个⽇历来指定⼀个时间范围
负责执⾏向QuartzScheduler注册的触发Trigger的⼯作线程
ThreadPool :
Scheduler使⽤⼀个线程作为任务运⾏的基础设施,任务通过共享线程池中的线程提⾼运⾏效率
QuartzSchedulerResources :
包含穿件QuartzScheduler实例所需的所有资源(JobStore,ThreadPool等)
JobStore :
通过类实现的接⼝,这些类要为org.quartz.core.QuartzScheduler的使⽤提供⼀个org.quartz.Job和org.quartz.Trigger存储机制.作业和触发
器的存储应该以其名称和组的组合为唯⼀性
QuartzScheduler :
Quartz的核⼼,他是org.quartz.Scheduler接⼝的间接实现,包含调度org.quartz.Jobs ,注册org.quartz.JobListener实例等的⽅法
Scheduler :
这是Quartz Scheduler的主要接⼝,代表⼀个独⽴运⾏容器. 调度程序维护JobDetails和触发器的注册表.⼀旦注册,调度程序负责执⾏作业,
当她们的相关连的触发器触发(当她们的预定时间到达时 )
Trigger:
具有所有触发器通⽤属性的基本接⼝,描述了job执⾏的时间触发规则,
使⽤TriggerBuilder实例化实际触发器
JobDetail :
传递给定作业实例的详细信息属性.
JobDetails将使⽤JobBuilder创建/定义
Job :
表⽰要执⾏的"作业"的类的实现接⼝.
只有⼀个⽅法:
void execute(JobExecutionContext context);
(JobExecutionContext 提供调度上下⽂各种信息,运⾏时数据保存在jobDataMap中 )
Job 有个⼦接⼝StatefulJob,代表没有状态任务
有状态任务不可并发,前次任务没有执⾏完,后⾯任务则⼀直处于阻塞等待状态
2. ⼀个job可以被多个Trigger 绑定,但是⼀个Trigger只能绑定⼀个job!
7. quartz.properties Quartz可更改配置
//调度标识名集群中每⼀个实例都必须使⽤相同的名称(区分特定的调度器实例)
org.quartz.scheduler.instanceName:DefaultQuartzScheduler
//ID设置为⾃动获取每⼀个必须不同(所有调度器实例中是唯⼀的)
org.quartz.scheduler.instanceId :AUTO
//数据保存⽅式为持久化
org.quartz.jobStore.class :org.quartz.impl.jdbcjobstore.JobStoreTX
//表的前缀
org.quartz.jobStore.tablePrefix : QRTZ_
//设置为TRUE不会出现序列化⾮字符串类到 BLOB 时产⽣的类版本问题
//eProperties : true
//加⼊集群 true 为集群 false不是集群
org.quartz.jobStore.isClustered : false
//调度实例失效的检查时间间隔
org.quartz.jobStore.clusterCheckinInterval:20000
//容许的最⼤作业延长时间
org.quartz.jobStore.misfireThreshold :60000
//ThreadPool 实现的类名
org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool
//线程数量
org.quartz.threadPool.threadCount : 10
//线程优先级
org.quartz.threadPool.threadPriority : 5(threadPriority 属性的最⼤值是常量 ng.Thread.MAX_PRIORITY,等于10。
最⼩值为常量 ng.Thread.MIN_PRIORITY,为1)//⾃创建⽗线程
//org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
//数据库别名
org.quartz.jobStore.dataSource : qzDS
//设置数据源
org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz
er:root
org.quartz.dataSource.qzDS.password:123456
org.quartz.dataSource.qzDS.maxConnection:10
8. JDBC插⼊表顺序
主要的JDBC操作类,执⾏sql顺序:
基本顺序:
记录⼯作内容
插⼊触发器列表
对应类型trigger规则⼊库
存储已触发job信息和trigge信息
Simple_trigger :插⼊顺序
qrtz_job_details ---> qrtz_triggers ---> qrtz_simple_triggers
qrtz_fired_triggers
Cron_Trigger:插⼊顺序
qrtz_job_details ---> qrtz_triggers ---> qrtz_cron_triggers
qrtz_fired_triggers
⼆ . Cron 表达式
1. 为什么要使⽤cron表达式
我们之前提到有五种触发器归我们使⽤
其中常⽤的有 SimpleTrigger 和 CronTrigger
SimpleTrigger 是完全指定的时间反复进⾏⼯作的时间表
CronTrigger 却拥有着充分的可根据⽇历预定的⽅案且它包含Simple⽅案中的初始启动时间
例如:
每个星期五中午
每个⼯作⽇的早上10:30
周三周五 9:00-10:00 每五分钟⼀次
2. Cron Expressions
Cron 表达式并不是只是使⽤在 Quartz中的 ,实际上它作为⼀种专门的表达式也应⽤在Linux的定时任务中 ,以及在java中Spring的@Scheduled注解也都使⽤了
Cron表达式是字符串形式
Cron本质上是由七个⼦表达式,描述个别细节的时间表⽽这些⼦表达式是由空格分开的
⼦表达式:
位置意义有效值可⽤特殊字符
1Seconds0-59, - * /
2Minutes0-59, - * /
3Hours0 - 23, - * /
4Day-of-Month 1 - 31 ( 注意⼀些特别的⽉份), - * / ? L W
5Month0 - 11 或字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV DEC”, - * /
6Day-of-Week(每周)1 - 7 或字符串“SUN, MON, TUE, WED, THU, FRI, SAT”表⽰ * 注意: 1==SUN, - * / ? L #
7Year(年可选字段)empty 或者 1970-2099, - * /
3. 特殊字符
显然通过⼦表达式并不能写出⼀个重复执⾏的表达式
⽽特殊字符就是来解决当前问题的
特殊字符 :
符
号
表⽰举例说明
/每与当前⼦表达式结合使⽤占⽤⼀个⼦表达式位置例: "3/15" 放在第⼆个⼦表达式位上, 表⽰第三分钟开始执⾏,每15分钟执⾏⼀次
?某⼀天只存在与 Day-of-Month 和 Day-of-Week 中使⽤,来解决这两个表达式的冲突问题在其中⼀个⼦表达式有值的情况下 ?写在另⼀个表达式上表⽰匹配任意值,这样我们就不会再⽤* 去来表⽰匹配任意值了例: 每⽉15号的早上4点 : "0 0 4 15 * ?" 每周五晚上11点: "0 0 23
? * FRI"L 每⽉ 或每
周 的最后
⼀天
只存在与 Day-of-Month 和 Day-of-Week 中使⽤, 在 Day-of-Month ⼦表达式中,“L”表⽰⼀个⽉的最后⼀天 在 Day-of-Week ⼦表达式中,“L”表⽰⼀个星期的最后⼀天,也就是SAT 例: “0 15 10 ? * 6L” 表⽰ 每⽉最后⼀个星期五10:15分运⾏。
"0 15 10 2L * ?" 表⽰ 每⽉倒数第⼆天10:15分运⾏。
W
最近⼯作⽇只存在与 Day-of-Month 最近的⼯作⽇: 例: "0 15 10 15W * ?" 每个⽉距离15⽇最近的⼯作⽇ 如 15⽇是周六则执⾏时间是14⽇ 若15⽇是周⽇ 则执⾏时间是16 如15号是⼯作⽇就15执⾏ 就近匹配不会跨出当前⽉#
第⼏个星期⼏只存在与 Day-of-Week 中 每⽉第n 个⼯作⽇ 例:“0 15 10 ? * 6#3” 表⽰每个⽉第三个星期五 “0 15 10 ? * 4#2” 表⽰每个⽉第⼆个星期三,多个例: "0 0 0,13,18,21 * * ?": 每天的0点、13点、18点、21点都执⾏⼀次:
-区间例: "0 0-5 14 * * ?" : 在每天下午2点到下午2:05期间的每1分钟触发
*补位符
补位 但是 注意: Day-of-Month 和 Day-of-Week 肯定有⼀个为 ? 也不能两个 ?符号表⽰举例说明综合例⼦:
"0 0/30 0-4 ? 3,7 5#2 2018":
30分钟执⾏⼀次
凌晨的0-4 点
每个⽉
3 ⽉和 7⽉
第⼆个周四
2018年
: 2018年 的三⽉和7⽉的第⼆个周四的凌晨0-4点 开始每30分钟执⾏⼀次
"0 30 4 10LW * ?":
第四位是 Day-of-Month L 在此表⽰ 每个⽉最后
10L 表⽰每⽉的倒数第⼗天 (不⼀定是21号 ⽉份不同倒数的第⼏天也就不同 ) W 表⽰ 附近的⼯作⽇ 所以表⽰每个⽉离倒数第⼗天最近的⼯作⽇的凌晨4点30分执⾏⼀次。