1.Quartz概述:简单的说就是java的一个定时任务的框架,没有那么复杂的解释,跟前端的定时器一样。在了解它之前,首先熟悉几个概念。
2.基本概念
2.1 Job:表示一个工作,要执行的具体内容。此接口中只有一个方法 void execute(JobExecutionContext context)
2.2 JobDetail:JobDetail 表示一个具体的可执行的调度程序, Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
2.3 Trigger 代表一个调度参数的配置,什么时候去调。
2.4 Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。
解释:
l 编写 job 实现业务,要做什么具体事情问题。
l 使用 JobDetail 包装 job,是任务对象,可以被调度
l 使用 Trigger (触发器对象)定制什么时候去调用某任务对象。
l 使用 Scheduler 结合任务对象和触发器对象,很像一个大管家。
3.运行原理
1、scheduler 是一个计划调度器容器(总部),容器里面可以盛放众多的 JobDetail 和 trigger,
当容器启动后,里面的每个 JobDetail 都会根据 trigger 按部就班自动去执行。
2、 JobDetail 是一个可执行的工作,它本身可能是有状态的。
3、 Trigger 代表一个调度参数的配置,什么时候去调。
4、当 JobDetail 和 Trigger 在 scheduler 容器上注册后,形成了装配好的作业(JobDetail 和
Trigger 所组成的一对儿),就可以伴随容器启动而调度执行了。
5、 scheduler 是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提
高容器效率
3.案例:
3.1简单任务
3.1.1:引入相关的jar包
3.1.2:编写相关的任务
代码如下:

1 package cn.itcast.test; 2 3 import org.junit.Test; 4 import org.quartz.JobBuilder; 5 import org.quartz.JobDetail; 6 import org.quartz.Scheduler; 7 import org.quartz.SchedulerException; 8 import org.quartz.SimpleScheduleBuilder; 9 import org.quartz.Trigger; 10 import org.quartz.TriggerBuilder; 11 import org.quartz.impl.StdSchedulerFactory; 12 13 import cn.itcast.service.HelloJob; 14 15 public class Testquartz { 16 17 // 简单任务测试 18 @Test 19 public void testSimpleTask(){ 20 21 try { 22 23 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 24 scheduler.start(); 25 26 // define the job and tie it to our HelloJob class 27 JobDetail job = JobBuilder.newJob(HelloJob.class) 28 .withIdentity("job1", "group1") 29 .build(); 30 31 // Trigger the job to run now, and then repeat every 40 seconds 32 Trigger trigger = TriggerBuilder.newTrigger() 33 .withIdentity("trigger1", "group1") 34 .startNow() 35 .withSchedule(SimpleScheduleBuilder.simpleSchedule() 36 .withIntervalInSeconds(3) 37 .repeatForever()) 38 .build(); 39 40 // Tell quartz to schedule the job using our trigger 41 scheduler.scheduleJob(job, trigger); 42 43 //不让junit终止jvm 44 while(true){ 45 46 } 47 48 } catch (SchedulerException se) { 49 se.printStackTrace(); 50 } 51 } 52 53 }
3.1.3:计划任务
和简单任务相比,主要区别是策略不同

1 public class QuartzTest { 2 3 // 复杂任务 4 @Test 5 public void testCronTrigger() throws SchedulerException{ 6 // 获取调度器 7 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 8 9 // 开启大管家 10 scheduler.start(); 11 12 // define the job and tie it to our HelloJob class 13 JobDetail job = JobBuilder.newJob(HelloQuartz.class) 14 .withIdentity("job1", "group1") 15 .build(); 16 17 // Trigger the job to run now, and then repeat every 40 seconds 18 Trigger trigger = TriggerBuilder.newTrigger() 19 .withIdentity("trigger1", "group1") 20 .startNow() 21 // 每隔5秒执行 22 .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * ? * *")) 23 .build(); 24 25 // Tell quartz to schedule the job using our trigger 26 scheduler.scheduleJob(job, trigger); 27 28 // 终止JVM执行 29 while(true){ 30 31 } 32 33 }
本测试使用的jar包:

1 <dependencies> 2 <dependency> 3 <groupId>org.quartz-scheduler</groupId> 4 <artifactId>quartz</artifactId> 5 <version>2.2.3</version> 6 </dependency> 7 <dependency> 8 <groupId>org.quartz-scheduler</groupId> 9 <artifactId>quartz-jobs</artifactId> 10 <version>2.2.3</version> 11 </dependency> 12 <!-- slf4j log4j --> 13 <dependency> 14 <groupId>org.slf4j</groupId> 15 <artifactId>slf4j-log4j12</artifactId> 16 <version>1.7.7</version> 17 </dependency> 18 <dependency> 19 <groupId>junit</groupId> 20 <artifactId>junit</artifactId> 21 <version>4.11</version> 22 <scope>test</scope> 23 </dependency> 24 </dependencies>