介绍
Quartz是一个开源的计划任务工具库。
- 官方网站:Quartz-2.2.x文档
- 源码下载:Downloads
安装
如果是直接下载jar包
将quartz-2.2.x.jar包放到classpath目录下即可。
如果是maven项目中引用,则坐标如下:
<!-- 主要实现包 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<!-- [可选]官方实现Job的工具包 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
使用入门
基本概念
类/接口 | 描述 |
---|---|
Scheduler | 计划任务容器,提供任务和触发器的CRUD操作 |
JobDetail | 任务信息,如:id,name和绑定自定义数据等 |
Trigger | 触发器信息,如:开始时间,计划类型(定时/循环)等 |
Job | 触发动作,区别于JobDetail本人认为叫Action会好理解些 |
SchedulerFactory | Scheduler工厂类接口,具体实现有StdSchedulerFactory |
JobBuilder | JobDetail工厂类,用于创建JobDetail实例并提供配置方法 |
TriggerBuilder | Trigger工厂类,用于创建Trigger实例并配置方法 |
结构图示
Hello world应用
- 关于内部类的说明,请参考《内部类的一些事》
- 本例为了说明Quartz的TriggerBuilder的withSchedule方法,所以把生成Trigger部分拆分成两段,按照官网上的例子,其实可以串联方式直接build。
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class HelloWorld {
// 如果使用内部类必须是静态内部类方式实现Job接口,
// 否则Quartz反射生成不了Job实例
public static class NestedJob implements Job{
// 实现execute接口,任务调度时触发以下方法
public void execute(JobExecutionContext ctx)
throws JobExecutionException {
// TODO Auto-generated method stub
try {
// 获取本次触发的实例id
System.out.println("action " + ctx.getFireInstanceId() + " begin:"
+ ctx.getFireTime());
Thread.sleep(4 * 1000L);
System.out.println("action " + ctx.getFireInstanceId() + " end:"
+ ctx.getFireTime());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// 1.实例化工厂类
SchedulerFactory sf = new StdSchedulerFactory();
try {
// 2.得到一个StdScheduler实例,创建线程池
Scheduler s = sf.getScheduler();
// 标识开始
s.start();
// 3.通过JobBuilder工厂,生成JobDetail并绑定NestedJob类
JobDetail jd = JobBuilder.newJob(NestedJob.class)
.withIdentity("myjob", "mygroup").build();
// 4.定义触发器的计划任务,从“现在”开始计划
TriggerBuilder<Trigger> tb = TriggerBuilder.newTrigger().startNow();
// 每隔3s执行一次,并一直循环
Trigger t = tb
.withSchedule(
SimpleScheduleBuilder.repeatSecondlyForever(3))
.withIdentity("mytrigger", "mygroup").build();
// 将任务和触发器注册到计划任务容器中
s.scheduleJob(jd, t);
// 本例需要暂停主线程,让任务线程跑起来
Thread.sleep(10 * 1000L);
// 强制停止所有任务线程,删除所有注册的任务信息
s.shutdown();
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果
action 1464458138847 begin:Sun May 29 01:55:39 CST 2016
action 1464458138848 begin:Sun May 29 01:55:41 CST 2016
action 1464458138847 end:Sun May 29 01:55:39 CST 2016
action 1464458138849 begin:Sun May 29 01:55:44 CST 2016
action 1464458138848 end:Sun May 29 01:55:41 CST 2016
…