Quartz 框架重要的组成部分:
一、Scheduler 调度器
二、Trigger 触发器 包括SimpleTrigger和CronTrigger
三、JobDetail 执行任务
一、加入Quartz相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
二、编写要实现定时任务的类
编写一个类实现Job接口重写里面的execute方法
public class PrintWordsJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());
System.out.println("自定义任务开始: " + printTime + ", 执行工作:" + new Random().nextInt(100));
}
}
2、编写实现定时任务的类
1、创建一个定时任务调度器(用来负责定时任务的执行)
2、创建一个定时任务具体执行的实例对象,设置相关参数(具体执行的任务)
3、创建定时任务触发器(用来控制具体的定时任务多长周期执行一次)
4、具体执行定时任务通过start方法执行
public static void main(String[] args) throws SchedulerException, InterruptedException {
// 1、创建调度器Scheduler
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 2、创建JobDetail实例,并与PrintWordsJob类绑定(Job执行内容)
JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)
.withIdentity("任务One", "组织One").build();
// 3、构建Trigger实例,每隔1s执行一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("扳机One", "扳机组织One")
.startNow()//立即生效,标志着何时生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
//每隔1s执行一次
.withIntervalInSeconds(5)
.repeatForever()).build();//一直执行
//4、执行
scheduler.scheduleJob(jobDetail, trigger);
System.out.println("开始执行定时任务:--.--");
scheduler.start();
//睡眠
TimeUnit.SECONDS.sleep(15);
scheduler.shutdown();
System.out.println("固定时长后进行睡眠");
}
三、额外参数设置:
对应二中的第二步:
四、参数解释:
1、JobDetail:JobDeatil绑定指定的Job ,每次Scheduler调度执行一个Job的时候,首先会拿到对应的Job并创建其实例,再去执行Job中的execute()的内容,任务执行结束后,关联的Job对象实例会被释放,且会被JVM GC清除。 防止多线程下发生并发问题;
2、JobExecutionContext:保存着执行JobDeatil时所携带的参数信息
3、JobDateMap 是继承自Map中间保存数据的格式采用的是Key value ;
4、Trigger:触发器 会通知Scheduler具体执行任务的时间;
new Trigger().startAt():表示触发器首次被触发的时间;
new Trigger().endAt():表示触发器结束触发的时间;
五、通过特殊的Trigger触发器模型:
// 3、构建Trigger实例,每隔1s执行一次
Date startDate = new Date();
startDate.setTime(startDate.getTime() + 5000);
Date endDate = new Date();
endDate.setTime(startDate.getTime() + 5000);
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
.usingJobData("Cron", "Cron类型的触发器")
.startNow()//立即生效
.startAt(startDate)
.endAt(endDate)
.withSchedule(CronScheduleBuilder.cronSchedule("* 30 10 ? * 1/5 2018"))
.build();