定时任务最主要的三个核心
任务 Job
调度器 Scheduler
触发器 Trigger [Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job)]
Job:中包含了任务执行的逻辑,Scheduler负责扫描需要执行的Job任务,Tragger负责定时。
同样重要的几个成员
JobDetail :客户端创建(我们自己),绑定Job的实例信息。一个JobDetail可以有多个Trigger,但是一个Trigger只能对应一个JobDetail。
JobBuilder: 定义和创建JobDetail实例的接口
TriggerBuilder:定义和创建触发器Trigger实例
JobDataMap:可以包含不限量的(序列化的)数据对象,在job实例执行的时候,可以使用其中的数据;
Trigger 主要有四种类型 【一般最常用的是SimpleTrigger 和 CronTrigger】
SimpleTrigger :一般用于实现每隔一定时间执行任务,以及重复多少次,如每 60 秒执行一次,重复执行 6 次。
CronTrigger :使用Cron表达式来进行定时
DailyTimeIntervalTrigger:会在给定的时间区间内每隔 N(1, 2, 3...)秒或小时执行任务
CalendarIntervalTrigger 一般用于处理基于日历时间重复间隔任务
执行流程:
scheduler.start()----》trigger被触发----》Job的excute被调用,通过返回给excute方法JobExecutionContext参数
JobExecutionContext中包含着
执行job的scheduler的引用
触发job的trigger的引用
JobDetail对象引用,以及一些其它信息。
下面实际操作一下
步骤一:建立一个Job的实现类 HelloJob
package com.quartz.quartz.test;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;
/**
* @Author EJiao
* @Date 2019/3/28 11:28
**/
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDetail detail = jobExecutionContext.getJobDetail();
String name = detail.getJobDataMap().getString("name");
System.out.printf("========say hello to "+ name + "at ===>" + new Date());
}
}
步骤二 建立 JobDetail 与Job实现类绑定(可在其中设置名称和分组名,
//创建一个JobDetail,将该实例与HelloJob绑定
public static JobDetail getJobDetail(){
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)//定义Job类为HelloJob类,这是真正的执行逻辑所在
.withIdentity("myJob","group1") //定义name/group
.usingJobData("name","一哈哈")//定义属性
.build();
return jobDetail;
}
步骤三创建指定的Trigger 【SimpleTrigger】
//内部实现机制是通过计算间隔时间来计算下次的执行时间, misfired 的任务并且恢复执行时,会扰乱我们的预期执行时间
public static Trigger getSimpleTrigger(int time,Date endTime){
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("name", "group1") //定义name/group
.startAt(new Date()) //设置开始时间【注意,时间的设置要在任务调度设置之前】
.endAt(endTime) //设置结束时间
.startNow()//一旦加入scheduler,立即生效
.withSchedule(simpleSchedule() //使用SimpleTrigger
// .withIntervalInSeconds(time) //每隔一秒执行一次
.repeatForever())//一直执行,奔腾到老不停歇
// .withRepeatCount(3)) //重复执行3次(一共4次)
.build();
return trigger;
}
【CronTrigger】
public static Trigger getCronSchedule(){
Trigger tigger = TriggerBuilder.newTrigger()
.withIdentity("calendar","group1")
.usingJobData("name","易嘻嘻")
.withSchedule(CronScheduleBuilder.cronSchedule("*/2 * * * * ?")) //每隔2秒执行一次
.build();
return tigger;
}
main测试一下
public static void main(String[] args) throws SchedulerException{
//创建Schedule实例【方式1】
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
//创建Schedule实例【方式2】
Scheduler scheduler2 = StdSchedulerFactory.getDefaultScheduler();
Date endTime = new Date();
endTime.setTime(endTime.getTime()+8000); //执行8秒后结束,(这里要设置重复执行不然只会执行一次)
// scheduler.scheduleJob(getJobDetail(),getSimpleTrigger(1,endTime));
scheduler.scheduleJob(getJobDetail(),getCronSchedule());
scheduler.start();
}