笔记来源: IMOOC Java Quartz
Quartz 特色java
主要用到的设计模式git
Quartz 三个核心概念github
重要组成segmentfault
Trigger设计模式
Calendar框架
监听器分布式
execute
方法,相似 TimerTask
的 run
方法,在里面编写业务逻辑package org.quartz; public interface Job { void execute(JobExecutionContext context) throws JobExecutionException; }
Job 实例在 Quartz 中的生命周期函数
execute
方法前会建立一个新的 job 实例JobDetail
为 Job 实例提供了许多设置属性,以及 JobDataMap
成员变量属性,它用来存储特定 Job 实例的状态信息,调度器须要借助 JobDetail
对象来添加 Job 实例。工具
重要属性ui
name
group
jobClass
jobDataMap
Scheduler
调用一个 Job,就会将 JobExecutionContext
传递给 Job 的 execute()
方法;JobExecutionContext
对象访问到 Quartz 运行时候的环境以及 Job 自己的明细数据。JobDataMap
存储在 JobExecutionContext
中,很是方便获取。JobDataMap
能够用来装载任何可序列化的数据对象,当 job 实例对象被执行时这些参数对象会传递给它。JobDataMap
实现了JDK的Map接口,并添加了一些很是方便的方法用来存取基本数据类型。获取 JobDataMap
的两种方式
JobDataMap
的键值(Quartz 框架默认的 JobFactory
实现类在初始化 job 实例对象时会自动地调用这些 setter 方法)Trigger
对象是用来触发执行 Job
的。触发器通用属性
JobKey
:表示 job 实例的标识,触发器被触发时,该指定的 job 实例会执行。StartTime
:表示触发器的时间表首次被触发的时间。它的值类型是 java.util.Date
。EndTime
:指定触发器的再也不被触发的时间。withRepeatCount
重复次数能够是 0
,正整数或是 SimppleTrigger.REPEAT_INDEFINITELY
常量值。withIntervalInSeconds
等重复执行间隔必须为 0
或 长整数 endTime
参数,那么它会覆盖重复次数参数的效果CronTrigger
的做用:基于日历的做业调度器,而不是像 SimpleTrigger
那样精确指定间隔时间,比SimpleTrigger
更经常使用。CronTrigger
实例;[秒] [分] [时] [日] [月] [周] [年]
字段 | 是否必填 | 容许值 | 容许特殊字符 |
---|---|---|---|
秒 | 是 | 0~59 | , - * / |
分 | 是 | 0~59 | , - * / |
时 | 是 | 0~23 | , - * / |
日 | 是 | 1~31 | , - * ? / L W C |
月 | 是 | 1~12 或 JAN~DEC | , - * / |
周 | 是 | 1~7 或 SUN~SAT | , - * ? / L C # |
年 | 否 | empty 1970~2099 | , - * / |
表达式 | 含义 |
---|---|
0 15 10 ? | 天天10点15分触发 |
0 0/5 14 ? | 天天下午2点到2点59分(整点开始,每隔5分钟触发) |
0 15 10 ? * MON-FRI | 从周一到周五天天上午的10点15分触发 |
0 15 10 ? * 6#3 | 每个月的第三周的星期五开始触发 |
0 15 10 ? 6L 2018-2019 | 从2018年到2019年每个月最后一周的星期五10点15分触发 |
0/5 14,18 * ? | 天天14:00:00~14:59:5五、18:00:00~18:59:55,每5秒触发一次 |
特殊字符 | 含义 |
---|---|
* | 表示全部值。例如:在[分]的字段上设置 *,表示每一分钟都会触发 |
? | 表示不指定值。使用的场景为不须要关系当前设置这个字段的值。例如:要在每个月的10号触发一次,但不关心是周几,全部须要将[周]设置为 ?,具体设置为 0 0 0 10 * ? |
- | 表示区间。例如:在[时]上设置 10-12,表示十、十一、12点都会触发 |
, | 表示指定多个值。例如:在[周]上设置 MON,WED,FRI 表示周1、3、五触发 |
/ | 用于递增触发。例如:在[秒]上设置 5/15 表示从5秒开始,每增15秒触发(五、20、3五、50)。又如在[月]上设置 1/3,表示每个月1号开始,每隔三天触发 |
L | 表示最后的意思。在[日]字段上设置,表示当月的最后一天;在[周]字段上表示星期六(7 或 SAT);若是在L前加上数字,则表示该数据的最后一个。例如在[周]上设置 6L,表示“本月的最后一个星期五” |
W | 表示离指定日期最近那个工做日(周一至周五),例如在[日]字段上设置 15W,表示离每个月15号最近的那个工做日触发。日光指定格式为 1W,则表示每个月1号日后最近的工做日触发。(W前只能设置具体的数字,不容许区间-) |
# | +序号(表示每个月的第几个周几),例如在[周]字段上设置 6#3 表示在每个月的第三个周六,注意若是指定 #5,正好第五周没有周六,则不会触发该配置。(#用在母亲节和父亲节再适合不过了) |
L
和 W
能够组合使用全部的 Scheduler 实例应该由 SchedulerFactory
来建立
SchedulerFactory
- StdSchedulerFactory
SchedulerFactory
- DirectSchedulerFactory
SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); DirectSchedulerFactory factory = DirectSchedulerFactory.getInstance(); Scheduler scheduler = factory.getScheduler();
Java.util.Properties
来建立和初始化 Quartz 调度器quartz.properties
中getScheduler
方法就能建立和初始化调度器对象Date scheduleJob(JobDetail jobDetail, Trigger trigger)
void start()
- 开始/继续执行void standby()
- 挂起void shutdown()
shutdown(true)
表示等待全部正在执行的 job 执行完毕以后,再关闭 schedulershutdown(false)
即 shutdown()
表示直接关闭 scheduler若项目无 quartz.properties
,将会去 quartz.jar
包读取默认 quartz.properties
。
调度器属性
org.quartz.scheduler.instanceName
属性用来区分调度器实例,能够按功能用途来给调度器起名。org.quartz.scheduler.instanceId
属性和前者同样,也容许任何字符串,但这个值必须是在全部调度器实例中是惟一的,尤为是在一个集群当中,做为集群的惟一key。假如你想 Quartz 帮你生成这个值的话,能够设置为 AUTO
。线程池属性
org.quartz.threadPool.threadCount
:指定线程数,至少为1(无默认值)(通常设置为1-100直接的整数合适)org.quartz.threadPool.threadPriority
:设置线程的优先级(最大为java.lang.Thread.MAX_PRIORITY
10,最小为Thread.MIN_PRIORITY
1,默认为5)org.quartz.threadPool.class
:线程池的实现类(通常使用 SimpleThreadPool
可知足几乎全部用户的需求)做业存储设置
插件配置
- 相关例子代码:https://github.com/gcusky/lea...
- 较简单的 Java 定时任务调度工具:Timer
- Akka 利用 Extension 集成 Quartz:akka-quartz-scheduler