Quartz学习笔记(一)快速入门
最近在工作中用到了Quartz,趁此机会学习了一下,顺便写些笔记记录一下。
参照Quartz官方文档
什么是Quartz
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目。
它完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。
Quartz 核心概念
我们需要明白 Quartz 的几个核心概念,这样理解起 Quartz 的原理就会变得简单了
- Job 表示一个工作,要执行的具体内容。此接口中只有一个方法:
void execute(JobExecutionContext context)
- JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
- Trigger 代表一个调度参数的配置,什么时候去调
- Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了
Quartz的运行环境
- Quartz 可以运行嵌入在另一个独立式应用程序。
- Quartz 可以在应用程序服务器(或 servlet 容器)内被实例化,并且参与 XA 事务。
- Quartz 可以作为一个独立的程序运行(其自己的 Java 虚拟机内),可以通过 RMI 使用
- Quartz 可以被实例化,作为独立的项目集群(负载平衡和故障转移功能),用于作业的执行。
快速入门
快速搭建好springboot项目,引入Quartz依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
实现org.quartz.Job,创建自己的job实现
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* @author chunhui.tan
* @创建时间 2019年3月15日 下午3:06:08
*
*/
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.err.println("hello,quartz");
}
}
实例化SchedulerFactory,获取Scheduler实例,构建JobDetail,Trigger。然后用Scheduler实例将JobDetail,Trigger加入调度容器并start。
scheduler被停止后,除非重新实例化,否则不能重新启动;只有当scheduler启动后,即使处于暂停状态也不行,trigger才会被触发(job才会被执行)。
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
/**
* @author chunhui.tan
* @创建时间 2019年3月15日 下午3:01:38
* */
public class HelloQuartz {
public static void main(String[] args) throws SchedulerException {
//构建SchedulerFactory实例
SchedulerFactory schedFact = new StdSchedulerFactory();
//获取Scheduler实例
Scheduler scheduler = schedFact.getScheduler();
//构建JobDetail实例
JobDetail job = JobBuilder.newJob(HelloJob.class)
.withIdentity("helloJob", "hello")//给job命名并分组
.build();
//构建Trigger实例
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("helloTrigger", "hello")//给trigger命名并分组
.startNow()
.withSchedule(SimpleScheduleBuilder
.simpleSchedule().withIntervalInSeconds(5).repeatForever())
.build();
//将JobDetail实例和Trigger实例加入到调度容器
scheduler.scheduleJob(job, trigger);
//启动容器
scheduler.start();
}
}
结果
hello,quartz
19:56:07.382 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'hello.helloJob', class=com.quartz.test.HelloJob
hello,quartz
19:56:07.383 [DefaultQuartzScheduler_Worker-2] DEBUG org.quartz.core.JobRunShell - Calling execute on job hello.helloJob
19:56:07.383 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
19:56:12.382 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'hello.helloJob', class=com.quartz.test.HelloJob
19:56:12.382 [DefaultQuartzScheduler_Worker-3] DEBUG org.quartz.core.JobRunShell - Calling execute on job hello.helloJob
19:56:12.382 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
hello,quartz
Quartz API
Quartz API的关键接口是:
- Scheduler - 与调度程序交互的主要API。
- Job - 由希望由调度程序执行的组件实现的接口
- JobDetail - 用于定义作业的实例。
- Trigger(即触发器) - 定义执行给定作业的计划的组件。
- JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。
- TriggerBuilder - 用于定义/构建触发器实例。
Scheduler作为Quartz的核心API,相当于一个调度容器,负责管理Job,JobDetail,Trigger。
Job里面主要是一些业务内容,而JobDetail 则封装了一些Job的属性,比如job的名称和分组。
Trigger主要封装一些调度要素,比如调度周期,开始时间,结束时间等等。
Scheduler的生命期
Scheduler的生命期, 从SchedulerFactory创建它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被创建后,可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job)
builder类
JobBuilder 主要构建JobDetail
SchedulerBuilder 定义不同类型的调度计划(schedule)
- CronScheduleBuilder 定义corn表达式类型的schedule
- SimpleScheduleBuilder 定义简单类型的schedule
TriggerBuilder 定义Trigger
DateBuilder 可以很方便地构造表示不同时间点的java.util.Date实例