Quartz
Quartz是一个完全由java编写的开源作业调度框架。它可以创建简单或者复杂的几十、几百、甚至成千上万的job。此外,quartz调度器还支持JTA事务和集群。
添加依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>${quartz.version}</version>
</dependency> <!-- druid -->
Quartz 三要素
- Scheduler:任务调度器,所有的任务都是从这里开始。
- Trigger:触发器,定义任务执行的方式、间隔。
- JobDetail & Job : 定义任务具体执行的逻辑。
Cron表达式
Cron作为一个Unix工具,已经存在很长一段时间了,用于实现任务调度的功能。
格式
顺序 |
秒 |
分钟 |
小时 |
日期 |
月份 |
星期 |
年(可选) |
取值 |
0-59 |
0-59 |
0-23 |
1-30(31) |
1-12 |
1-7 |
|
允许特殊字符 |
, - * / |
, - * / |
, - * / |
, - * / ? L W C |
, - * / |
, - * / L # C |
1970-2099 , - * / |
字段含义
*:代表所有可能的值 -:指定范围 ,:列出枚举 例如在分钟里,"5,15"表示5分钟和20分钟触发 /:指定增量 例如在分钟里,"3/15"表示从3分钟开始,每隔15分钟执行一次 ?:表示没有具体的值,使用?要注意冲突 L:表示last,例如星期中表示7或SAT,月份中表示最后一天31或30,6L表示这个月倒数第6天,FRIL表示这个月的最后一个星期五 W:只能用在月份中,表示最接近指定天的工作日 #:只能用在星期中,表示这个月的第几个周几,例如6#3表示这个月的第3个周五
示例
0 * * * * ? 每1分钟触发一次 0 0 * * * ? 每天每1小时触发一次 0 0 10 * * ? 每天10点触发一次 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发 0 30 9 1 * ? 每月1号上午9点半 0 15 10 15 * ? 每月15日上午10:15触发 */5 * * * * ? 每隔5秒执行一次 0 */1 * * * ? 每隔1分钟执行一次 0 0 5-15 * * ? 每天5-15点整点触发 0 0/3 * * * ? 每三分钟触发一次 0 0 0 1 * ? 每月1号凌晨执行一次
如何禁止并发执行?
答:项目中出现了一种情况,本来job执行时间只需要10s,但是由于数据库量增大之后,执行时间变成了60s,而我设置的间隔时间是30s,这样就会出现上次任务还没执行完成,下次任务就开始执行了。所以,在这种情况下,我们要禁止quart的并发操作。
有2种方式:
方式一:spring中将job的concurrent属性设置为false。默认是true。
方式二:job类上加上注解@DisallowConcurrentExecution。
Spring+Quartz
Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法可以是普通类。很显然,第二种方式远比第一种方式来的灵活。
上面提到的Quartz的三要素Scheduler、Trigger、JobDetai&Job, 对应到xml文件,也就是xml中的几个bean对象。
一个scheduler可以对应多个Trigger,它的属性是个list集合。
一个jobDetail可以对应多个job
job可以自己指定方法名也可以通过实现job接口,实现execute方法。
Spring整合Quartz进行配置遵循下面的步骤