quartz特点
Quartz是一个优秀的任务调度框架, 具有以下特点
- 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
- 负载均衡
- 高可用
quartz 架构体系
Quartz 设计有四个核心类,分别是Scheduler(调度器)、Job(任务) 、Trigger(触发器)、JobDetail(任务详情),他们是使用Quartz的关键。
调度器作为作业的总指挥,触发器作为作业的操作者,作业为应用的功能模块,其关系如下图所示:
Job接口
定时任务的接口,具体定时任务需要实现该接口
定义需要执行的任务,该类是一个接口,只定义了一个方法execute(JobExecutionContext context),在实现类的execute方法中编写所需要定时执行的Job(任务),JobExcutionContext类提供了调度应用的一些信息。Job运行时的信息保存在JobDataMap实例中。
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("开始执行定时任务...");
}
}
Trigger接口
负责设置调度策略,该类是一个接口,描述触发job执行的时间触发规则
有以下这些子类,其中经常用到的是cronTigger

公共属性
- triggerKey:表示Trigger身份的属性
- jobKey:Trigger触发时被执行的Job的身份
- startTime:Trigger第一次触发的时间
- endTime:Trigger失效的时间点
- 优先级(priority):如果Trigger很多,或者Quartz线程池的工作线程太少,Quartz可能没有足够的资源同时触发所有的Trigger,这种情况下,如果希望某些Trigger优先被触发,就需要给它设置优先级,Trigger默认的优先级为5,优先级priority属性的值可以是任意整数,正数、负数都可以。(只有同时触发的Trigger之间才会比较优先级)
SimpleTrigger
指定从某一个时间开始,以一定时间间隔(单位:毫秒)执行的任务
关键属性
- repeatInterval:重复间隔
- repeatCount:重复次数,实际执行次数是repeatCount+1(因为在startTime的时候一定会执行一次)
代码示例
TriggerBuilder.newTrigger()
//设置Trigger的name以及group
.withIdentity("my_job_tigger", "my_job_tigger_group")
//trigger 开始生效时间
.startAt(new Date(System.currentTimeMillis() + 5000))
//调度策略
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).withRepeatCount(10))
//trigger开始失效时间
.endAt(new Date(System.currentTimeMillis() + 15000))
//任务名词
.forJob("自定义JOB")
.build();
CalendarIntervalTrigger
类似于SimpleTrigger,指定从某一个时间开始,以一定的时间间隔执行的任务
但是不同的是SimpleTrigger指定的时间间隔为毫秒,没办法指定每隔一个月执行一次(每月的时间间隔不是固定值),而CalendarIntervalTrigger支持的间隔单位有秒,分钟,小时,天,月,年,星期
优点
- 更方便,比如每隔1小时执行,你不用自己去计算1小时等于多少毫秒
- 支持不是固定长度的间隔,比如间隔为月和年。但劣势是精度只能到秒
关键属性
- interval 执行间隔:intervalUnit 执行间隔的单位(秒,分钟,小时,天,月,年,星期)
代码示例
TriggerBuilder.newTrigger()
//设置Trigger的name以及group
.withIdentity("my_job_tigger", "my_job_tigger_group")
//trigger 开始生效时间,马上生效
.startNow()
//调度策略
.withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withInterval(10, DateBuilder.IntervalUnit.SECOND))
//trigger开始失效时间
.endAt(new Date(System.currentTimeMillis() + 15000))
//任务名词
.forJob("calendar_tigger_test")
.build();
DailyTimeIntervalTrigger
指定每天的某个时间段内,以一定的时间间隔执行任务,并且它可以支持指定星期
关键属性
- startTimeOfDay:每天开始时间
- endTimeOfDay:每天结束时间
- daysOfWeek:需要执行的星期
代码案例
TriggerBuilder.newTrigger()
//设置Trigger的name以及group
.withIdentity("my_job_tigger", "my_job_tigger_group")
//trigger 开始生效时间
.startNow()
//调度策略
.withSchedule(DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule()
//早上10点开始执行
.startingDailyAt(TimeOfDay.hourAndMinuteOfDay(10, 0))
//晚上8点停止执行
.endingDailyAt(TimeOfDay.hourAndMinuteOfDay(20, 0))
// 周一到周四执行,不写即每天执行
.onDaysOfTheWeek(DateBuilder.MONDAY, DateBuilder.TUESDAY, DateBuilder.WEDNESDAY, DateBuilder.THURSDAY)
//一小时执行一次
.withIntervalInHours(1)
//重复执行10次,总共执行11次
.withRepeatCount(10)
)
//trigger开始失效时间
.endAt(new Date(System.currentTimeMillis() + 15000))
//任务名词
.forJob("calendar_tigger_test")
.build();
CronTrigger
适合于更复杂的任务,它支持类型于Linux Cron的语法(并且更强大)
代码案例
TriggerBuilder.newTrigger()
//设置Trigger的name以及group
.withIdentity("my_job_tigger", "my_job_tigger_group")
//trigger 开始生效时间
.startNow()
//调度策略 每隔5S执行一次
.withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ?"))
//trigger开始失效时间
.endAt(new Date(System.currentTimeMillis() + 15000))
//任务名词
.forJob("calendar_tigger_test")
.build();
JobDetail
描述Job的实现类及其它

本文介绍了Quartz任务调度框架,它具有强大调度、负载均衡和高可用等特点。阐述了其架构体系,包括Scheduler、Job、Trigger、JobDetail四个核心类。还介绍了不同Trigger子类的特点和使用场景。针对单机方案的单点问题,给出了集群方案,包括架构、数据库初始化、任务管理及测试等内容。
最低0.47元/天 解锁文章
1185

被折叠的 条评论
为什么被折叠?



