最近项目中用到了Quartz任务调度库,在这里简单介绍一下,最新版的Quartz的基本使用和语法。
开始使用Quartz:
1.下载Quartz
下载地址点这里,下载了之后可以看到lib文件,我们在这里需要用到的jar文件,quartz---.jar是Quartz实现的jar,其他的3个jar的Quartz日志所需要的jar,下图这四个库是必须要使用的:
2.任务具体实现
在Quartz中,所有的任务都必须实现Job接口,Job中只有一个execute(JobExecutionContext context)
实现方法,我们的具体业务实现就得写在这个方法里面,这个方法将会在触发器满足调度条件是触发.
参数JobExecutionContext可以用来设置调用结果Result,通过put或者set方法.
代码示例:
package com.jelly.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class Job1 implements Job{
public void execute(JobExecutionContext arg0) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(sdf.format(new Date())+" ---- start Job");
}
}
JavaDoc截图:
3.设置简单调度任务
设置调度任务一共分为四个步骤
(1)实例化JobDetail(调度任务):
由于JobDetail是一个接口,所以必须通过JobBuilder实例化JobDetail,看一下具体代码:
JobBuilder jobBuilder = JobBuilder.newJob(Job1.class);
jobBuilder.withIdentity("job1", "group1");
JobDetail jobDetail = jobBuilder.build();
通过JobBuilder的newJob方法设置需要执行的Job任务类名,withIdentity是设置JobDetail的name和gruop(如果没有设置的话,将会随机生成name和group)最后通过build方法就可以实例化JobDetail.
(2)实例化Trigger(触发器):
Trigger也是个接口,只能通过TriggerBuilder去实例化,具体代码:
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity("tigger1", "group1");
triggerBuilder.startNow();
triggerBuilder.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(60).repeatForever());
Trigger trigger = triggerBuilder.build();
TriggerBuilder的newTrigger去获取TriggerBuilder对象,设置name和group(不设置将会随机生成),调用startNow设置Trigger开始的时间为当前时间,通过withSchedule设置触发器的调度规则。最后通过build方法获取对象.
SimpleScheduleBuilder先不用管是什么,在后面会解释,理解为任务的触发条件就行,在这里设置60秒重复一次,重复次数无限.
(3)为调度程序设置任务和触发器,开始调度:
JobDetail和Trigger实例化完成之后,设置调度程序,开始调度任务.由于Scheduler是interface,无法直接实例化,通过JavaDoc知道只能通过SchedulerFactory来获取,但是SchedulerFactory也是interface,最后找到了实现类StdSchedulerFactory,具体代码:
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
通过StdSchedulerFactory的getDefaultScheduler获取一个Scheduler,为Scheduler设置Job和Trigger,调用start开始调度.
还有一种获取Scheduler的方式,由于StdSchedulerFactory实现了SchedulerFactory的接口,故可以直接实例化StdSchedulerFactory,然后通过getScheduler获取Scheduler.
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
(4)关闭任务调度:
scheduler.shutdown();
4.触发器的两种模式
任务调度有两种模式.一种是SimpleSchedule(简单模式),这种只能实现简单的调度,比如多少秒重复触发
等简单的任务调度。另外一种是CronSchedule(表达式模式),这种模式是基于Cron时间表达式.下面介绍一下这两种模式:
(1)简单模式
在这种模式下只能根据提供的Api指定一些简单的时间重复调度,可以指定重复的次数,repeatForever代表无限重复,其他重复次数可以通过withRepeatCount(int triggerRepeatCount)来指定.
triggerBuilder.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(60).repeatForever());
介绍一下常用的方法:
withIntervalInHours(int intervalInHours)
设置几小时重复一次
withIntervalInMinutes(int intervalInMinutes)
设置几分钟重复一次
withIntervalInSeconds(int intervalInSeconds)
设置几秒钟重复一次
(2)表达式模式
表达式模式就是可以通过时间表达式来具体指定在什么时间执行任务,可以用来时间比较复杂的时间调度,在这里设置了每小时51分的时候执行任务.
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(new CronExpression("0 51 * * * ? ")));
关于时间表达式的语法在这里就不重复介绍了,想了解的同学点这里.我觉得也没必要去记,需要的时候可以借助这个工具去生成地址,如果不能满足要求,再去找资料就行了.
完整代码:
(1)简单模式
package com.jelly.quartz;
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 TestJob1 {
public static void main(String[] args) {
try {
//实例化JobDetail
JobBuilder jobBuilder = JobBuilder.newJob(Job1.class);
jobBuilder.withIdentity("job1", "group1");
JobDetail jobDetail = jobBuilder.build();
//实例化Trigger
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity("tigger1", "group1");
triggerBuilder.startNow();
triggerBuilder.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(60).repeatForever());
Trigger trigger = triggerBuilder.build();
//开始任务
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
(2)表达式模式
package com.jelly.quartz;
import org.quartz.CronExpression;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class TestJob2 {
public static void main(String[] args) {
try {
JobBuilder jobBuilder = JobBuilder.newJob(Job1.class);
jobBuilder.withIdentity("job1", "group1");
JobDetail jobDetail = jobBuilder.build();
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity("tigger1", "group1");
triggerBuilder.startNow();
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(new CronExpression("0 51 * * * ? ")));
Trigger trigger = triggerBuilder.build();
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印结果:
(1)简单模式
2016-12-05 06:01:45 ---- start Job
2016-12-05 06:02:45 ---- start Job
2016-12-05 06:03:45 ---- start Job
(2)表达式模式
2016-12-05 06:51:00 ---- start Job
2016-12-05 07:51:00 ---- start Job
2016-12-05 08:51:00 ---- start Job
参考:
JavaDoc
documentation