一、Quartz是什么?
官方来说:quartz是一个作业调度框架。很晦涩难懂,什么是作业调度框架呢?白话来说,quartz像是一个程序的管家,咱们指定告诉它我什么时候要干什么事情,它就会按照指令,定时执行,相当于数据库中的 Job、Windows 的计划任务。(官网地址:http://www.quartz-scheduler.org/)
二、简单使用
百度一下quartz,会发现百度百科的介绍里有一句特别吸引人的话:“尽管Quartz框架整合了许多额外功能,但就其简易形式看,你会发现它易用得简直让人受不了!”它到底简单到多么令人受不了呢?
1.加jar包
Quartz自己quartz.jar和依赖包commons-logging.jar 、slf4j-log4j12-1.5.10.jar 、slf4j-api-1.5.10.jar。
2.创建一个类
package quartz;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
importorg.quartz.impl.StdSchedulerFactory;
import java.util.Date;
public class QuartzReport implements Job{
public void execute(JobExecutionContextcntxt) throws JobExecutionException {
System.out.println("输出:"+cntxt.getJobDetail().getJobDataMap().get("name")+newDate());
}
public static void main(String[] args) {
try {
SchedulerFactory schedFact=newStdSchedulerFactory();
Schedulersched=schedFact.getScheduler();
sched.start();
JobDetail jobDetail=newJobDetail("a","b",QuartzReport.class);
jobDetail.getJobDataMap().put("name","Mango");
CronTrigger trigger=new CronTrigger("c","d");
trigger.setCronExpression("0/1 * * * * ? " ); // 启动之后立即执行 每一秒继续重复。
sched.scheduleJob(jobDetail,trigger);
} catch (Exception e) {
e.printStackTrace();
}
}
}
直接执行,输出结果:
三、知识补充
我们通过一个小Demo,大概知道了quartz是什么,怎么用,下面我们要补充一下quartz的其他知识。
Quartz的工作原理
对于一个调度作业,通常有两个因素构成:调度的内容【What】:即调度具体做什么工作,例如是发邮件、系统备份;调度的时间【when】:什么时候工作,这个又包含两个内容,开始时间【调度第一次执行的时间】,调度时间【在调度开始之后,在什么时间的时候,执行定义的调度工作】。
Quartz框架提供了Job接口和Trigger接口来分别对应调度的内容和调度时间,由于Job接口和Trigger接口是完全分离的,彼此互不关心,他们之间要建立某种关联,就需要通过Scheduler来帮助他们建立联系。Quartz启动时,会初始化一套work线程池,这套线程被用于执行预定义的调度作业。Job和Trigger的关联根据配置的不同【基于内存的调度、基于数据库的调度】而不同:如果是基于内存的调度,那么Job信息和Trigger信息分别放到两个HashMap中,通过RAMJobSupport来建立关联;如果是基于数据库的调度,Job信息、Tirgger信息以及它们的关联信息都被存到数据库表中。
和JDKTimer API的比较
目前已有的调度框架除了Flux Scheduler, Enterprise BatchingQueuing等一些商业版本之外,还有JDK自带的Timer和TimerTask,对于商业版本不作任何评估,目前只是对能免费使用的两个常用的调度框架做一些比较:
JDK Timer/TimerTask | Quartz |
每个任务一个线程 | 线程池 |
只是基于内存的调度 | 内存&数据库 |
不能支持很复杂的调度 | CronTrigger可以定义复杂的调 |
quartz除了基于内存的调度外,还支持基于数据库的调度。关于表达式和意义大家自己可以上网搜索。同样Java里面的好东西,.NET里面也有,quartz.NET有兴趣的朋友可以看一下。
四、结尾
任务调度在目前的JAVA应用程序中运用的十分普遍,故掌握QUARTZ是必备的技能。个人的一点经验是,在用quartz时,如果遇到设置、代码没问题但仍然报错的情况,可以清理一下缓存试试,会有帮助的。在java开发中,我们很少单独使用quartz,一般是和其他框架一起使用,比如spring啊,下篇博客我们将介绍quartz和spring的整合。