简单介绍:
Quartz 是一个用来实现作业调度(Job Scheduler)的工具,官网介绍说你可使用 quartz scheduler创建并执行 简单或复杂的成千上万的 JOBS。并且Quartz包括很多企业级的特性,例如 支持JTA transcations 和 分布式集群。
主要类:
1) interface Job 接口Job是你定义的所有job都会实现的接口,Job接口定义 如下
void execute(JobExecutionContext context) throws JobExecutionException;
我们可以在execute中来实现我们JOB要实现的功能 JobExecutionContext在quartz中扮演一个上下文的角色,就行servlet中的ServletContext。同过context我们可以获得这个job的配置信息和在执行中传递的参数。例如我定义一个MyJob 类 执行一次就打印 “吸烟有害健康”。
public class MyJob implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("吸烟有害健康");
}
}
2)interface jobDetail Jobdetail是对job的一个包装,唯一的实现类是JobDetailImpl,使用它可以定义一个job的名字和组名。但一般我们不直接创建jobDetail,一般使用Jobbuilder去创建jobDetail创建方法如下
JobDetail job=JobBuilder.newJob(MyJob.class)
.withIdentity("myjob","mygroup")
.build();
通过jobBuilder创建好JobDetail后我们自己定义的MyJob就和jobDetail关联上了。
内部实现很简单就是在JobBuilder创建jobDetail时设置的属性传递到joibDetail属性上,例如newJob(Class<? extends Job>)方法的定义
public static JobBuilder newJob(Class <? extends Job> jobClass) {
JobBuilder b = new JobBuilder();
b.ofType(jobClass);
return b;
}
public JobBuilder ofType(Class <? extends Job> jobClazz) {
this.jobClass = jobClazz;
return this;
}
把我们的MyJob.class赋值到this.jobClass. winthIdentity(String jobname,String grouname)方法定义如下
public JobBuilder withIdentity(String name, String group) {
key = new JobKey(name, group);
return this;
}
JobKey维护了JobName和GroupName这两个属性,JobKey代码为
public final class JobKey extends Key<JobKey> {
private static final long serialVersionUID = -6073883950062574010L;
public JobKey(String name) {
super(name, null);
}
public JobKey(String name, String group) {
super(name, group);
}
public static JobKey jobKey(String name) {
return new JobKey(name, null);
}
public static JobKey jobKey(String name, String group) {
return new JobKey(name, group);
}
}
在build()方法中将这些参数传递到JobDetail中
public JobDetail build() {
JobDetailImpl job = new JobDetailImpl();
job.setJobClass(jobClass);
job.setDescription(description);
if(key == null)
key = new JobKey(Key.createUniqueName(null), null);
job.setKey(key);
job.setDurability(durability);
job.setRequestsRecovery(shouldRecover);
if(!jobDataMap.isEmpty())
job.setJobDataMap(jobDataMap);
return job;
}
JobDetail.setKey的实现如下
public void setKey(JobKey key) {
if(key == null)
throw new IllegalArgumentException("Key cannot be null!");
setName(key.getName());
setGroup(key.getGroup());
this.key = key;
}
3)interface Trigger Trigger是触发器每一个触发器都可以控制一个JOB的执行,Tigger的实现类有很多这里使用SimpleTrigger,使用方式如下
Trigger trigger=newTrigger()
.withIdentity("myTrgger","mygroup")
.startAt(date)
.build();
myTrgger是触发器的名字,mygroup是组名和你想要控制的job放到一个组里就可以了。
date参数可以这样获得,意思是在下一个整秒的日期
Date date=DateBuilder.evenSecondDate(new Date());
Trigger是一个控制job执行的控制器, trigger里有很多设置,通过这些设置可以实现我们要的基本所有的功能。这里startAt()设置执行Job的时间。
4)interface SchedulerFactory 的实现类有两个分别是 StdSchedulerFactory 和DirectSchedulerFactory 我使用的是第一个。这个类可以生产Scheduler
SchedulerFactory sf=new StdSchedulerFactory();
5) interface Scheduler Scheduler 接口是我们的调度器管理所有的Job和trgger的。
首先要获得一个Scheduler对象
Scheduler scheduler=sf.getScheduler();
管理Job
scheduler.scheduleJob(job,trigger);
这样就可以使用了
启动:scheduler.start();
结束:scheduler.shutdown(true);