在软件开发中,很多时候需要在特定时间的时间执行某些操作,比如每天的凌晨三点、每周的周日、每个月的15号,Apache Quartz就是一个开源的作业调度框架,可以让计划的程序任务一个预定义的日期和时间运行。这篇博客记录一下Quartz的安装、重要概念和入门例子。
一、Quartz下载
Quartz官网:http://www.quartz-scheduler.org/
以2.2.3版本为例,下载 Quartz 2.2.3 .tar.gz,解压,把quartz-2.2.3-distribution\quartz-2.2.3\lib
目录下jar包添加到工程中即可,如果使用maven,添加一下依赖:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
二、入门例子
先写一个类,MyJob.java,注意,这个类一定要是public的。
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("My QuarTz Job");
System.out.println("执行时间:"+new Date());
}
}
再写一个QuartzTest.java,实现每天24:00执行MyJob中的任务:
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
public class QuartzTest{
public static void main(String[] args) {
//创建一个SchedulerFactory对象
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = null;
try {
//通过SchedulerFactory对象获取任务调度器
scheduler = schedulerFactory.getScheduler();
//创建一个job
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "group1")
.build();
//定义触发器,也就是执行job的规则
Trigger trigger=TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 * * ?"))
.build();
//把job和触发器注册到调度器中
scheduler.scheduleJob(job,trigger);
//启动调度器
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
执行QuartzTest类中的main方法,等到00:00的时候就会执行MyJob中的任务:
My Quartz Job
执行时间:Tue Aug 01 00:00:00 CST 2017
三、核心概念
先扫盲单词,查词典:
Quartz:石英,一种矿石
有一种手表叫石英手表:
我一直没想明白为什么定时任务调度框架以一块石头命名,如果和石英手表联系起来,和精准的时间联系起来,似乎有点道理了。我猜测开发这个框架的程序员给框架命名的时候刚好戴了一块石英手表,就以Quartz命名了。好了,这段纯属瞎扯,为什么命名为Quartz有待考证(有知道的请告知),脑洞时间结束。
3.1 Scheduler(调度器)
schedule:名词,任务,时刻表
scheduler:名词,程序调度器
如果想通过Quartz创建定时任务,那么首先创建一个用于任务调度的调度器,也就是Scheduler
的对象。Scheduler
对象要通过调度器工厂类SchedulerFactory
创建。
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
3.2 Job(任务)
job就是我们要执行的任务,也就是MyJob中的代码。一个Java类,先实现Job接口,再复写父类的execute()方法,然后创建JobDetail对象,传通过反射机制(也就是MyJob.class)实现JobDetail对象。
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "group1")
.build();
3.3 Trigger(触发器)
查单词:
tiger:老虎
trigger:枪的扳机、触发器
既然是定时任务,调度器也好了,任务也有了,什么时候执行任务就是在Trigger中配置的,每天的00:00扣动扳机:
Trigger trigger=TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 * * ?"))
把Job和Trigger装载到Scheduler中:
scheduler.scheduleJob(job,trigger);
启动:
scheduler.start();
等到00:00,砰,不是枪声,而是Quartz的定时任务执行了。
继续学习之后再补充。。。。