Quartz官网
http://www.quartz-scheduler.org/
特点
强大的调度功能
灵活的应用方式
分布式和集群能力
主要用到的设计模式
Builder 模式
Factory 模式
组件模式
链式写法
三个核心概念
调度器
任务
触发器
Quartz 体系结构
JobDetail scheduler trigger -SimpleTrigger -CronTrigger
重要组成
Job JobDetail JobBuilder JobStore Trigger TriggerBuilder ThreadPool Scheduler Calendar 监听器 JobListener TriggerListener SchedulerListener
Quartz 实例
依赖
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency>
定义任务 MyJob.java
package timer; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.text.SimpleDateFormat; import java.util.Date; public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(dateFormat.format(new Date())); } }
调度任务 QuartzDemo.java
package timer; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class QuartzDemo { public static void main(String[] args) throws SchedulerException { // 创建JobDetail JobDetail jobDetail = JobBuilder .newJob(MyJob.class) .withIdentity("myJob", "group1") .build(); // 每2s执行一次,无限循环 SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .repeatForever(); // 创建Trigger Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(scheduleBuilder) .build(); // 通过工厂方法创建Scheduler实例 SchedulerFactory factory = new StdSchedulerFactory(); Scheduler scheduler = factory.getScheduler(); scheduler.start(); scheduler.scheduleJob(jobDetail, trigger); } }
Job 和 JobDetail
1、Job 源码:
package org.quartz; public interface Job { void execute(JobExecutionContext context) throws JobExecutionException; }
2、Job 的生命周期:
每次调度器执行 Job 时,调用 execute 方法前会创建一个新的 Job 实例
调用完成后,关联的 Job 对象实例会被释放,释放的实例会被垃圾回收机制回收
3、JobDetail:
JobDetail 为 Job 实例提供了许多设置属性,以及 JobDataMap 成员变量属性,
它用来存储特定 Job 实例的状态信息,调度器需要借助 JobDetail 对象来添加 Job 实例
4、JobDetail 重要属性
name
group 默认值DEFAULT
jobClass
jobDataMap
// 创建JobDetail JobDetail jobDetail = JobBuilder .newJob(MyJob.class) .withIdentity("myJob", "group1") .build(); // 打印jobDetail属性 System.out.println(jobDetail.getKey().getName()); // myJob System.out.println(jobDetail.getKey().getGroup()); // group1 System.out.println(jobDetail.getJobClass().getName()); // timer.MyJob
JobExecutionContext & JobDataMap
1、JobExecutionContext:
Scheduler 给 Job 传递参数
2、JobDataMap:
可以装载任何可序列化的数据对象
实现了 Map 接口
设置 JobDataMap 部分代码
// 创建JobDetail JobDetail jobDetail = JobBuilder .newJob(MyJob.class) .withIdentity("myJob", "group1") .usingJobData("name", "jobDetail") .build(); // 每2s执行一次,无限循环 SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .repeatForever(); // 创建Trigger Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .usingJobData("name", "trigger") .withSchedule(scheduleBuilder) .build();
获取 JobDataMap
方法一:直接从 JobDataMap 对象中获取
package timer; import org.quartz.*; import java.text.SimpleDateFormat; import java.util.Date; public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 获取 jobkey JobKey jobKey = jobExecutionContext.getJobDetail().getKey(); System.out.println(jobKey.getName()); // myJob System.out.println(jobKey.getGroup()); // group1 // 获取JobDetail的DataMap JobDataMap jobDetailDataMap = jobExecutionContext.getJobDetail().getJobDataMap(); System.out.println(jobDetailDataMap.getString("name")); // jobDetail // 获取Trigger的DataMap JobDataMap triggerDataMap = jobExecutionContext.getTrigger().getJobDataMap(); System.out.println(triggerDataMap.getString("name")); // trigger // 获取合并后的DataMap JobDataMap dataMap = jobExecutionContext.getMergedJobDataMap(); System.out.println(dataMap.getString("name")); // trigger } }
方法二:定义同名变量获取
package timer; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class MyJob implements Job { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println(this.name); } }