今天在做后台项目的时候,遇到了定时器定时任务,用的是quartz,以前没有做过类似的定时任务。
在使用的时候,总结了几个问题。
1. 怎么使用?
2. 使用的时候难点在哪?
3. 这个东西的框架结构是什么样的。
4. 这个东西是怎么工作的。
5. cron表达式多么优秀,怎么实现的。想法哪儿来的。
于是就恶补了一下。在quartz里有几个重要的概念。Job,JobDetail,Triger,Scheduler
Job: 具体的定时任务都需要实现Job接口。
JobDetail:QuartZ在执行任务的时候,通过反射来实例化Job,JobDetail用于封装Job的具体参数,包括组,名字等。
Triger:触发器,用来定义定时任务的执行规则,什么时候执行。
Scheduler: 用来维护定时任务注册的容器,同时还当定时任务触发条件满足时来执行任务。
在触发器中,有一个叫做CronTrigger.在Cron中有一个表达式,Cron表达式使用起来特别方便,Cron表达式来源于linux的Cron服务,linux可以通过Crond来做定时任务。可以通过注解的方式来设置定时任务。
Cron的表达式由6-7个以空格隔开的字符串组成,帮助文档中对其是这么定义的
------------------------------------------------------------------------------------------------
位置 | 含义 | 允许的值 | 允许的特殊字符串 |
------------------------------------------------------------------------------------------------
1 | 秒数 | 0-59 | , - * / |
—————————————————————————————---------
2 | 分钟数 | 0-59 | , - * / |
—————————————————————————————---------
3 | 小时数 | 0-23 | , - * / |
—————————————————————————————---------
4 | 月份的第几天 | 1-31 | , - * ?/ L W |
—————————————————————————————---------
5 | 月 | 1-12 JAN-DEC | , - * / |
—————————————————————————————---------
6 | 周的第几天 | 1-7 SUN-SAT | , - * ?/ L # |
—————————————————————————————---------
7 | 年(可选) | 1970-2199 | , - * / |
—————————————————————————————————
注意: 位置6(周的第几天)是按照美国人的记法,将SUN,星期天记为第一天。1.
在这里面一共存在8个特殊字符:
, : 用于间隔多个值,比如 MON,WED, SAT
-: 用于表示范围,如 1-3 表示 1,2,3。是闭区间。
*: 用于表示任何情况
/: 在/的左右分别存在一个值,比如 10/20,(如果是分钟数)则表示10,30 ,50, 第一个数是初始值(可以为*,表示任意),第一个数表示增量。
?: 在月份的第几天和周的几天使用,表示“不定”的意思。用来解决两个字段(位置4,位置6)同时设置时冲突,将一方置为不确定。
L: 是last的缩写,只能用在月的第几天或周的第几天(4,6)位置,使用存在几种情况,单独使用L表示最后一天。如果1L在位置6表示这个月的最后一个星期天。
当用在月上时,L-3表示从第三天到最后一天。
W: 是weekday的缩写,用在位置4,后置使用,如4W则表示离4号最近的工作日,如果4号为星期六,则表示3号;如果4号为星期天,则表示5号。如果和L联用,LW则表示月的最后一个工作日。
最前面的代码的表达式的含义就能确定了,从任意分钟时间开始,每隔5分钟,在0秒时执行。
再看Scheduler, 作为定时任务的容器和执行器, 看看怎么获得Scheduler的;
通过工厂来获得Scheduler, 工厂是怎么创建Scheluder的,工厂通过scheduler仓库来存储scheduler实例。
SchedulerRepository就是一个简单的仓库,底层通过封装HashMap实现。
今天主要学习了quartz怎么使用的,什么是cron表达式,如何获得Scheduler的。