Quartz API
Quartz API核心接口有:
Scheduler – 与scheduler交互的主要API,是运行job的容器;
Job – 你通过scheduler执行任务,你的任务类需要实现的接口;
JobDetail – 定义Job的实例;
Trigger – 触发Job的执行;
JobBuilder – 定义和创建JobDetail实例的接口;
TriggerBuilder – 定义和创建Trigger实例的接口;
Scheduler在使用之前需要实例化。一般通过SchedulerFactory来创建一个实例。
Scheduler的生命期,从SchedulerFactory创建它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被创建后,可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job),
JobDetail对象由Quartz客户端在Job被加入到scheduler时创建。它包含了Job的各种设置属性以及一个JobDataMap对象,这个对象被用来存储给定Job类实例的状态信息。Trigger对象被用来触发job的执行。你希望将任务纳入到进度,要实例化一个Trigger并且“调整”它的属性以满足你想要的进度安排。Triggers也有一个JobDataMap与之关联,这非常有利于向触发器所触发的Job传递参数。Quartz打包了很多不同类型的Trigger,但最常用的Trigge类是SimpleTrigger和CronTrigger。
SimpleTrigger用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。
CronTrigger按照日历触发,例如“每个周五”,每个月10日中午或者10:15分。
为什么要分为Jobs和Triggers?
jobs可以被创建并且存储在job scheduler中,而不依赖于trigger,而且,很多triggers可以关联一个job.
另外的好处就是这种“松耦合”能使与日程中的Job相关的trigger过期后重新配置这些Job, 这样以后就能够重新将这些Job纳入日程而不必重新定义它们。这样就可以更改或者替换trigger而不必重新定义与之相连的job标识符。
简单实践
建立一个Java Project,引入包
1、建立Job类
package quartz.job;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
JobDataMap data = arg0.getMergedJobDataMap();
System.out.println("MyJob "
+ new SimpleDateFormat("yyyy-mm-dd HH:mm:ss")
.format(new Date()) + " someProp ---> "
+ data.getString("someProp"));
}
}
2、构建运行程序
package quartz.main;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import quartz.job.MyJob;
public class Main {
public static void main(String[] args) throws Exception {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler(); //构建scheduler
scheduler.start();
//构造JobDetail
JobDetail jobDetail = JobBuilder.newJob(MyJob.class) //加入自己的 Job
.withIdentity("myJob", "group1") // name "myJob", group "group1"
.build();
// Trigger the job to run now, and then every 3 seconds
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(3) //时间间隔
// .repeatForever() //一直重复
.withRepeatCount(5)) //重复5次,启动之后会立即执行一次,所以实际执行6次
.build();
scheduler.scheduleJob(jobDetail, trigger);
}
}
执行结果
MyJob 2016-36-22 14:36:01 someProp —> null
MyJob 2016-36-22 14:36:04 someProp —> null
MyJob 2016-36-22 14:36:07 someProp —> null
MyJob 2016-36-22 14:36:10 someProp —> null
MyJob 2016-36-22 14:36:13 someProp —> null
MyJob 2016-36-22 14:36:16 someProp —> null