本文基于Quartz 2.2版本,官方地址如下:
http://www.quartz-scheduler.org/
现在网上关于Quartz的文章,大多都是1.x版本的,但在2.x版本之后,Quartz的语法已经有了很大的不同。
其中最主要的一点就是,Quartz废弃了很多类的构造方法,而改为采用这些类的建造者类(Builder)来初始化它们。
对于Quartz而言,有三个最为基础的组件:Scheduler、Job及Trigger。其中:
如前所述,在1.x版本中,上述功能类的初始化都是通过其自身的构造方法完成的。但是到了2.x版本,绝大多数功能类的生成都需要通过专门的建造者来实现。下面的代码是一个例子:
import org.quartz.CalendarIntervalScheduleBuilder; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class QuartzTest { public static void main(String[] args) throws SchedulerException { Scheduler s = new StdSchedulerFactory().getScheduler(); s.start(); JobDetail job = JobBuilder.newJob().ofType(TestJob.class) .withIdentity("job1", "group1").build(); Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("trigger1", "group1") .startNow() // .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(10, 2)) // .withSchedule(CronScheduleBuilder.cronSchedule("0 30 9 * * ?")) .withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withIntervalInHours(2)) .build(); s.scheduleJob(job, trigger); // s.shutdown(true); } }
目前版本中,简单地,Scheduler的生成有两种方法,二者区别不大:
Scheduler s = new StdSchedulerFactory().getScheduler();
Scheduler s = StdSchedulerFactory.getDefaultScheduler();
只有调用了Scheduler的start方法后,任务调度才会开始。但是start的调用可以在JobDetail和Trigger的加载之前,也可以在之后。
JobDetail通过JobBuilder生成,而JobBuilder通过其静态方法newJob创建一个JobBuilder的实例。对于JobBuilder对象而言,ofType是必须调用的方法,通过它来加载实现了Job接口的类(示例中的TestJob类)。withIndentify方法将会生成一个JobKey的私有成员,它是JobDetail对象的唯一标志。
Trigger通过TriggerBuilder生成,TriggerBuilder通过其静态方法newTrigger创建一个TriggerBuilder的实例。与JobDetail相同,TriggerBuilder也通过withIndetify方法为Trigger对象创建唯一标志。此外,TriggerBuilder中还有startNow,startAt,endAt等方法,来设置任务触发及结束的时间。
如果用过1.x版本的Quartz,应该知道触发器还分为SimpleTrigger、CronTrigger等,但是在2.x版本中,这些具体的Trigger类都被废弃了,取而代之的是TriggerBuilder中的withSchedule方法。该方法需要传入一个SechduleBuilder对象,通过该对象来实现触发器的逻辑。
如示例中所示,2.2版本中的ScheduleBuilder有三种,分为是SimpleScheduleBuilder,CronScheduleBuilder及CalendarIntervalScheduleBuilder:
需要注意的是,withSchedule最多可能被同一个TriggerBuilder对象调用一次。若不调用,则任务会立即执行,且只执行一次。
另外,无论是JobDetail还是Trigger中,都拥有usingJobData来装载具体数据。
Scheduler对象可以通过许多方法来加载JobDetail和Trigger对象,scheduleJob方法是其中之一。此外还有addJob等。但需要注意的是,Scheduler中允许不存在JobDetail和Trigger,在此情况下调度器将空跑(即死循环);但是一旦加载了JobDetail,则至少必须加载一个Trigger,反之亦然。
当调用了shutdown方法后,调度器将结束循环,并终结其全部子线程。shutdown方法具有两个原型:
void shutdown();
void shutdown(boolean);
shutdown()等价于shutdown(false)。其布尔参数代表是否等待任务执行。若为false,则立即无条件结束调度;若为true,则允许当前正处于等待或正在执行的任务完成后再结束。
更多关于Quartz的信息,请参见Quartz的开发指南及API文档。