一、摘要
阅读完本文大概需要5分钟,本文主要分享内容如下:
- Quartz 架构介绍
- SpringBoot Quartz 应用整合
二、关于 Quartz
Quartz 是 OpenSymphony 开源组织在 Job scheduling 领域开源的一个作业调度框架项目,完全由 Java 编写,主要是为了实现在 Java 应用程序中进行作业调度并提供了简单却强大的机制!
Quartz 不仅可以单独使用,还可以与 J2EE 与 J2SE 应用程序相结合使用!
同时,Quartz 允许程序开发人员根据时间的间隔来调度作业!
与 JDK 中调度器不同的是,Quartz 实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联,一次可以调度几十个、上百个甚至上几万个复杂的程序!
三、Quartz 架构图
在详细介绍 Quartz 应用之前,我们先来看看它具体的架构图!
从图中可以看出,Quartz 框架主要包括如下几个部分:
- SchedulerFactory:任务调度工厂,主要负责管理任务调度器
- Scheduler:任务调度控制器,主要是负责任务调度
- Job:任务接口,即被调度的任务
- JobDetail:Job 的任务描述类,job 执行时会依据此对象的信息反射实例化出 Job 的具体执行对象。
- Trigger:任务触发器,主要存放 Job 执行的时间策略。例如多久执行一次,什么时候执行,以什么频率执行等等
- Calendar:Trigger 扩展对象,可以排除或者包含某个指定的时间点(如排除法定节假日)
- JobStore:存储作业和任务调度期间的状态
可能感觉很抽象,下面我们先来看一个简单的例子,示例代码如下:
/** * 实现 Job 任务接口 */ public class QuartzTest implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } public static void main(String[] args) throws SchedulerException { // 创建一个Scheduler Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 启动Scheduler scheduler.start(); // 新建一个Job, 指定执行类是QuartzTest, 指定一个K/V类型的数据, 指定job的name和group JobDetail job = JobBuilder.newJob(QuartzTest.class) .usingJobData("jobData", "test") .withIdentity("myJob", "myJobGroup") .build(); // 新建一个Trigger, 表示JobDetail的调度计划, 这里的cron表达式是 每1秒执行一次 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "myTriggerGroup") .startNow() .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); // 让scheduler开始调度这个job, 按trigger指定的计划 scheduler.scheduleJob(job, trigger); } }
运行结果如下:
2020-11-09 21:38:40 2020-11-09 21:38:45 2020-11-09 21:38:50 2020-11-09 21:38:55 2020-11-09 21:39:00 2020-11-09 21:39:05 2020-11-09 21:39:10 ...
整个代码虽然简单,但是五脏俱全,在应用方面使用最多的就是Job
和Trigger
。
下面,我们就一起从源码层面来看看具体怎么使用!