文章目录
- 关于 Quartz
- Quartz的体系结构
- 核心概念
- 设计模式
- 常用API
- 基本使用
关于 Quartz
- 官网:https://www.quartz-scheduler.org
- github : https://github.com/quartz-scheduler/quartz
- 文档:https://www.quartz-scheduler.org/documentation/
相关教程/博客
- 黑马程序员:Java教程之精品详解Quartz,企业中热门实用的技能
https://www.bilibili.com/video/BV19t41127de/? - 【Quartz】Quartz集群原理及其实现
https://mp.weixin.qq.com/s/xe4S-ZJVd7cfVhSSw7653g - 任务调度框架 Quartz 用法指南(超详细)
https://mp.weixin.qq.com/s/OuoDRb-sybwd23gRE94S8Q - 玩转 Quartz 框架,更优雅地管理你的定时任务!
https://mp.weixin.qq.com/s/oUDhqR4JxLxxbOPZOEr2Bg
Quartz 是OpenSymphony开源组织在Job scheduling 领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。
quartz 是开源且具有丰富特性的"任务调度库",能够集成于任何的java应用,小到独立的应用,大至电子商业系统。
quartz能够创建亦简单亦复杂的调度,以执行上十、上百,甚至上万的任务。
任务job被定义为标准的java组件,能够执行任何你想要实现的功能。quartz调度框架包含许多企业级的特性,如JTA事务、集群的支持。
简而言之,quartz就是基于java实现的任务调度框架,用于执行你想要执行的任何任务。
Quartz的体系结构
核心概念
- 任务Job
Job就是你想要实现的任务类,每一个Job必须实现org.quartz.job接口,且只需实现接口定义的execute()方法。 - 触发器Trigger
Trigger为你执行任务的触发器,比如你想每天定时3点发送一份统计邮件,Trigger将会设置3点进行执行该任务。Trigger主要包含两种SimpleTrigger和CronTrigger两种。关于二者的区别的使用场景,后续的课程会进行讨论。 - 调度器Scheduler
Scheduler为任务的调度器,它会将任务job及触发器Trigger整合起来,负责基于Trigger设定的时间来执行Job。
设计模式
- Builder模式
- Factory模式
- 组件模式
- 链式编程
常用API
以下是Quartz编程API几个重要接口,也是Quartz的重要组件
- Scheduler 用于与调度程序交互的主程序接口。
Scheduler 调度程序-任务执行计划表,只有安排进执行计划的任务Job(通过scheduler.scheduleJob方法安排进执行计划),当它预先定义的执行时间到了的时候(任务触发trigger),该任务才会执行。 - Job 我们预先定义的希望在未来时间能被调度程序执行的任务类,我们可以自定义。
- JobDetail 使用JobDetail来定义定时任务的实例,JobDetail实例是通过JobBuilder类创建的。
- JobDataMap 可以包含不限量的(序列化的)数据对象,在job实例执行的时候,可以使用
其中的数据;JobDataMap是Java Map接口的一个实现,额外增加了一些便于存取基本类型的数
据的方法。 - Trigger 触发器,Trigger对象是用来触发执行Job的。当调度一个job时,我们实例一个触发器然后调整它的属性来满足job执行的条件。表明任务在什么时候会执行。定义了一个已经被安排的任务将会在什么时候执行的时间条件,比如每2秒就执行一次。
- JobBuilder -用于声明一个任务实例,也可以定义关于该任务的详情比如任务名、组名等,这个声明的实例将会作为一个实际执行的任务。
- TriggerBuilder 触发器创建器,用于创建触发器trigger实例。
- JobListener、TriggerListener、SchedulerListener监听器,用于对组件的监听。
基本使用
按照官网的 Demo,搭建一个纯 maven 项目,添加依赖:
<!-- 核心包 -->
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version>
</dependency>
<!-- 工具包 -->
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.3.0</version>
</dependency>
新建一个任务,实现了 org.quartz.Job
接口:
public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("任务被执行了。。。");}
}
main 方法,创建调度器、jobDetail 实例、trigger 实例、执行:
public static void main(String[] args) throws Exception {// 1.创建调度器 SchedulerSchedulerFactory factory = new StdSchedulerFactory();Scheduler scheduler = factory.getScheduler();// 2.创建JobDetail实例,并与MyJob类绑定(Job执行内容)JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();// 3.构建Trigger实例,每隔30s执行一次Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(simpleSchedule().withIntervalInSeconds(30).repeatForever()).build();// 4.执行,开启调度器scheduler.scheduleJob(job, trigger);System.out.println(System.currentTimeMillis());scheduler.start();//主线程睡眠1分钟,然后关闭调度器TimeUnit.MINUTES.sleep(1);scheduler.shutdown();System.out.println(System.currentTimeMillis());
}
2024-04-22