1. Quartz 概述
Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购,目前是 Terracotta 旗下的一个项目。读者可以到下载Quartz 的发布版本及其源代码。
2. Quartz特点
作为一个优秀的开源调度框架,Quartz 具有以下特点:
- 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
- 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
- 分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升。
- 作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。
quartz调度核心元素:
- Scheduler:任务调度器,是实际执行任务调度的控制器。在spring中通过SchedulerFactoryBean封装起来。
- Trigger:触发器,用于定义任务调度的时间规则,有SimpleTrigger,CronTrigger,DateIntervalTrigger和NthIncludedDayTrigger,其中CronTrigger用的比较多,本文主要介绍这种方式。CronTrigger在spring中封装在CronTriggerFactoryBean中。
- Calendar:它是一些日历特定时间点的集合。一个trigger可以包含多个Calendar,以便排除或包含某些时间点。
- JobDetail:用来描述Job实现类及其它相关的静态信息,如Job名字、关联监听器等信息。在spring中有JobDetailFactoryBean和 MethodInvokingJobDetailFactoryBean两种实现,如果任务调度只需要执行某个类的某个方法,就可以通过MethodInvokingJobDetailFactoryBean来调用。
- Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中。实现Job接口的任务,默认是无状态的,若要将Job设置成有状态的,在quartz中是给实现的Job添加@DisallowConcurrentExecution注解(以前是实现StatefulJob接口,现在已被Deprecated),在与spring结合中可以在spring配置文件的jobDetail中配置concurrent参数。
3. 集群配置
quartz集群是通过数据库表来感知其他的应用的,各个节点之间并没有直接的通信。只有使用持久的JobStore才能完成Quartz集群。
- 数据库表:以前有12张表,现在只有11张表,现在没有存储listener相关的表,多了QRTZ_SIMPROP_TRIGGERS表。
- 建表SQL:下载,不同数据库有不同的表。
表名 |
说明 |
备注 |
QRTZ_CALENDARS |
以 Blob 类型存储 Quartz 的 Calendar 信息 |
|
QRTZ_CRON_TRIGGERS |
存储 Cron Trigger,包括 Cron 表达式和时区信息 |
|
QRTZ_FIRED_TRIGGERS |
存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息 |
|
QRTZ_PAUSED_TRIGGER_GRPS |
存储已暂停的 Trigger 组的信息 |
|
QRTZ_SCHEDULER_STATE |
存储少量的有关 Scheduler 的状态信息,和别的 Scheduler 实例(假如是用于一个集群中) |
|
QRTZ_LOCKS |
存储程序的悲观锁的信息(假如使用了悲观锁) |
|
QRTZ_JOB_DETAILS |
存储每一个已配置的 Job 的详细信息 |
|
QRTZ_JOB_LISTENERS |
存储有关已配置的 JobListener 的信息 |
|
QRTZ_TRIGGER_LISTENERS |
存储已配置的 TriggerListener 的信息 |
|
QRTZ_BLOG_TRIGGERS |
Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候) |
|
QRTZ_TRIGGERS |
存储已配置的 Trigger 的信息 |
QRTZ_LOCKS就是Quartz集群实现同步机制的行锁表,包括以下几个锁:
- CALENDAR_ACCESS
- JOB_ACCESS
- MISFIRE_ACCESS
- STATE_ACCESS
- TRIGGER_ACCESS
4. 创建项目
4.1 下载项目,运行看结果和流程;
4.2 Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactI