Quartz是一个优秀的Java任务调度框架,由于不久之后可能要做这方面的项目,这里先对它进行一些知识的储备。
创建一个Demo小程序来演示Quartz的基本用法,看下面这个示例:
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
* Author: zhun.shen
* Date: 2016-03-08 15:48
* Description:
*/
public class Demo {
public static void main(String[] args) throws SchedulerException, InterruptedException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
/**
* 启动调度器线程,并且注销其上的所以触发器对象,
* 如果需要保留其上的触发器,应该调用standby()方法
*/
scheduler.start();
/**
* 使用JobBuilder构建一个任务。
*
* 这个任务通过“一个实现了Job接口的类”指定任务的执行实现类,
* withIdentity(name, group)方法指定类任务的“名称”和“组名”,可以理解为key,用于标识这个任务;
* build()方法执行构建,构建出的对象为JobDetail。
*/
JobDetail job = JobBuilder.newJob(DemoJob.class)
.withIdentity("myJob", "group1")
.build();
/**
* 使用TriggerBuilder构建一个触发器。
*
* withIdentity(name, group)方法指定类触发器的“名称”和“组名”,用于标识这个触发器;
* startNow()方法表示这个触发器在当前的时间就应该开始触发任务,然而这个时候触发器可能还没有作用在调度器上;
* withSchedule(scheduleBuilder)方法指定这个触发器的调度规则,例子中的为“每2秒触发一次,永不停止”。
*/
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2)
.repeatForever())
.build();
/**
* 调度器真正开始调度任务
*/
scheduler.scheduleJob(job, trigger);
}
}
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* Author: zhun.shen
* Date: 2016-03-08 15:52
* Description:
*/
public class DemoJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("I will sleep in 3 seconds.");
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("HA HA HA, I am running!!!");
}
}
对于代码的含义,已在注释中说明。这里记录一下自己对这里面的几个概念的理解:
- Job:任务,实际上这是一个接口,供其它类去实现任务的具体处理过程。
- JobDetail:任务细节,这是通过Job的实现类构建出的任务的真正执行者。注意,这里每次被调度执行任务的时候,都会根据实现类创建一个新的对象
- Trigger:触发器,用来定义任务的调度规则,比如“执行时机”,“执行频率”等。
- Scheduler:调度器,用来根据触发器定义的调度规则,去调度对应的任务去执行。
- 其它:比如SchedulerFactory、JobBuilder、TriggerBuilder都是构建对应实例的工具类,比较容易理解。