概述
quartz通过Job,JobDetail,Trigger,Scheduler来调度一个任务。
Job:代表一个任务,具体的类要实现这个接口,这个接口只有一个方法void execute(JobExecutionContext context)
**JobDetail:**JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。
Trigger:代表一个调度参数的配置,什么时候去调。
Scheduler:代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。
job和jobdetail一般是联合使用,作为一个任务,要执行这个任务,还需要trigger调度器。需要把任务和调度器都注册到Scheduler容器里面。
quartz有两种调度方式,分为简单型的和表达式型的
maven导包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
简单型的使用
定义一个任务MyJob.java
实现Job接口
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 定义下一分钟执行的任务
* @author la pomme de terre
*
*/
public class Myjob implements Job{
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("hh:mm:ss");
String format = simpleDateFormat.format(date);
System.out.println(format+",我执行了");
}
}
定义一个定时器SimpleQuartz.java
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
public class SimpleQuartz {
public void run() throws Exception {
//创建一个Scheduler的工厂
SchedulerFactory sf=new StdSchedulerFactory();
//获得一个Scheduler实例
Scheduler scheduler = sf.getScheduler();
//设置定时任务,下一分钟执行
Date runTime = DateBuilder.nextGivenSecondDate(new Date(), 5);
//获得JobDetail
JobDetail job = JobBuilder.newJob(Myjob.class).withIdentity("job1", "group1").build();
//获得trigger
Trigger build = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
//讲job和trigger注册到Scheduler中
scheduler.scheduleJob(job, build);
scheduler.start();
}
}
测试简单简单计时
System.out.println("当前时间:"+new SimpleDateFormat("hh:mm:ss").format(new Date()));
SimpleQuartz simpleQuartz = new SimpleQuartz();
simpleQuartz.run();
运行结果
当前时间:06:55:30
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
06:55:35,我执行了
表达式
任务类MyJob.java
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class Myjob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("执行时间是:"+new SimpleDateFormat("hh:mm:ss").format(new Date()));
}
}
定时器类CronQuartz.java
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class CronQuartz {
public void run() throws Exception {
// 产生一个Scheduler
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
// 产生一个JobDetail
JobDetail jt = JobBuilder.newJob(Myjob.class).withIdentity("job1", "group1").build();
// 产生一个Trigger
CronTrigger build = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("1,6,11,16,21,26,31,36,41,46,51,56 * * * * ?")).build();
// 注册到Scheduler
scheduler.scheduleJob(jt, build);
// 启动
scheduler.start();
}
}
测试类
System.out.println("当前时间是:"+new SimpleDateFormat("hh:mm:ss").format(new Date()));
CronQuartz cronQuartz = new CronQuartz();
cronQuartz.run();
运行结果
当前时间是:06:58:11
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
执行时间是:06:58:11
执行时间是:06:58:16
执行时间是:06:58:21
执行时间是:06:58:26
执行时间是:06:58:31