SpringBoot工程集成Quartz
一、Quartz简介
Quartz是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。它允许程序开发人员根据时间的间隔来调度作业。实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。
二、Quartz核心思想
- Job 任务的接口,所有任务都需要实现这一接口,此接口中只有一个execute方法;
- JobDetail 表示一个具体的可执行的任务,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。
- Trigger 触发器,代表一个调度参数的配置,什么时候去调。
- Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。
三、集成Quartz
1、POM依赖导入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、JOB接口实现
public class DemoJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("Hello world!:" + jobExecutionContext.getJobDetail().getKey()+ LocalDateTime.now());
}
}
3、任务线程
public class QuartzThread extends Thread {
private String name;
public QuartzThread(String name) {
this.name = name;
}
@SneakyThrows
@Override
public void run() {
super.run();
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 创建HelloworldJob的JobDetail实例,并设置name/group
JobDetail jobDetail = JobBuilder.newJob(DemoJob.class)
.withIdentity("demoJob","demoJobGroup1")
//JobDataMap可以给任务传递参数
.usingJobData("job_param","job_param1")
.build();
// 创建Trigger触发器设置使用cronSchedule方式调度
String str1 = "2020-10-20 15:22:59";
String str2 = "2020-10-20 15:24:00";
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("demoTrigger","demoTriggerGroup1")
.usingJobData("job_trigger_param","job_trigger_param1")
.startAt(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(str1))
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMilliseconds(500).repeatForever())
.endAt(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(str2))
// .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
.build();
// 注册JobDetail实例到scheduler以及使用对应的Trigger触发时机
scheduler.scheduleJob(jobDetail,trigger);
// 启动scheduler
scheduler.start();
}
}
4、运行结果
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:22:59.009
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:09.002
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:19.001
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:29
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:39.001
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:49
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:59
四、其他关键说明
1、任务的启动与关闭
调度器实例化后,它就能够启动,等待执行和关闭。需要注意的是一旦调度器调用 了shutdown 方法关闭后,如果不重新实例化,它就不会启动了。触发器在调度器未启动时,或是终止状态时,都不会被触发。
2、触发器Trigger
常用的触发器有SimpleTrigger和CronTrigger,SimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次。CronTrigger通常比SimpleTrigger更有用,如果需要基于日历的概念而不是按照SimpleTrigger的精确指定间隔进行重新启动的作业启动计划。使用CronTrigger,可以指定号时间表,例如“每周五中午”或“每个工作日和上午9:30”,甚至“每周一至周五上午9:00至10点之间每5分钟”和“1月份的星期五”。