Lession 1
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();
// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
.withIdentity("myJob", "group1")
.build();
// Trigger the job to run now, and then every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
比较简单,直接上代码。可以看出,主要需要三个角色
1、Scheduler:负责任务的执行,start,shutdown、scheduleJob
2、JobDetail:描述具体任务,标志之类的
3、Trigger:指定了定时方式
上述类都实现了Build模式,可以很方便的创建。
Lession 2
具体介绍了一下各个类的作用:
- Scheduler - the main API for interacting with the scheduler.
- Job - an interface to be implemented by components that you wish to have executed by the scheduler.
- JobDetail - used to define instances of Jobs.
- Trigger - a component that defines the schedule upon which a given Job will be executed.
- JobBuilder - used to define/build JobDetail instances, which define instances of Jobs.
- TriggerBuilder - used to define/build Trigger instances
定义Job应该实现 Job类,JobExecutionContext是运行上下文
package org.quartz;
public interface Job {
public void execute(JobExecutionContext context)
throws JobExecutionException;
}
每个job和trigger都有自己的key,保证唯一,便于分组。例如报告jobs、运维jobs
Lession 3 Jobs和JobDetails
上节说到 JobDetails可以通过JobBuilder构建,同时应该关联具体的Job。
Job运行的时候如果需要一些参数的话,可以使用JobDataMap传入。然后通过Context获取。
1、Context中可分分别获取JobDetail或者是Trigger的DataMap,但是,merge之后的总是后者覆盖前者。
2、MergedDataMap可以直接注入到Job属性字段中。
Lesson 4: More About Triggers
1、Priority-相同时间点执行的Trigger,优先级高的先执行;
2、MisFIre:错过执行的。
3、Calendars:用来排除和包括一个时间段
Lesson 5: Simple Trigger
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
这些构造器里面的方法基本够用了。
可以指定MisfireInstructions.
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
MISFIRE_INSTRUCTION_FIRE_NOW
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT
rigger.MISFIRE_INSTRUCTION_SMART_POLICY
Lesson 6: CronTrigger
chron trigger 是更加常用的方式,schedule通过一串字符指定。
总共七个字段:
Seconds Minutes Hours Day-of-Month Month Day-of-Week Year(optioal field)
日期的方式:
JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC
特殊字符有:
/ 表示增量
? 表示不指定,用于dayofmonth or dayofweek
L 用于dayofmonth or dayofweek,表示最后一天,可以用例如L-3表示偏移量,或者6L指定index
W 用于指定靠近某天的工作日
# 表示一个月的第几个想起几 FRI#3表示一个月的第三个星期五
Lesson 7: TriggerListeners and JobListeners
监听事件,实现相应的接口就可以,但是注意的是,每个listener都应该有名字,否则报错。
Listener需要向Scheduler注册
Lesson 8: SchedulerListener
实现相应的接口就可以。