前言
项目中总要写那么几个定时任务来处理一些事情。一些简单的定时任务使用Spring自带的定时任务就能完成。但是如果需要大量的定时任务的话要怎么才能统一管理呢?
本文介绍Quartz分布式调度框架。
介绍
Quartz介绍
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由java开发的一个开源的任务日程管理系统。 目前是 Terracotta 旗下的一个项目。官网地址 http://www.quartz-scheduler.org/ 可以 下载 Quartz 的发布版本及其源代码。
特点
- 集成方便(完全使用Java编写)
- 无需依赖可集群部署也可单机运行
- 可以通过JVM独立运行
Job
创建一个任务只需要实现Job接口即可
触发器
- 可以通过 Calendar 执行(排除节假日)
- 指定某个时间无线循环执行 比如每五分钟执行一次
- 固定时间执行 例如每周周一上午十点执行
一般情况使用SimpleTrigger,和CronTrigger,这些触发器实现了Trigger接口。或者 ScheduleBuilder 子类 SimpleScheduleBuilder和CronScheduleBuilder。
对于简单的时间来说,比如每天执行几次,使用SimpleTrigger。对于复杂的时间表达式来说,比如每个月15日上午几点几分,使用CronTrigger以及CromExpression 类。
注意 :一个job可以被多个Trigger 绑定,但是一个Trigger只能绑定一个job
存储
有两种存储方式 RAMJobStore和 JDBCJobStore 。
RAMJobStore不需要外部数据库调度信息存储在JVM内存中 所以,当应用程序停止运行时,所有调度信息将被丢失存储多少个Job和Trigger也会受到限制。
JDBCJobStore 支持集群所有触发器和job都存储在数据库中无论服务器停止和重启都可以恢复任务同时支持事务处理。
实战
准备
上面简单的介绍了一下Quartz,然后现在开始实战,本文使用SpringBoot整合。
项目地址:https://gitee.com/lqlm/toolsList_lqcoder
首先创建数据库表因为太多了就不房子文章中了可以去官方网站下载,也可以用我的下载地址下载
地址: https://lqcoder.com/quartz.sql
创建完成之后:
Table Name |
Description |
---|---|
QRTZ_CALENDARS |
存储Quartz的Calendar信息 |
QRTZCRONTRIGGERS |
存储CronTrigger,包括Cron表达式和时区信息 |
QRTZFIREDTRIGGERS |
存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息 |
QRTZPAUSEDTRIGGER_GRPS | 存储已暂停的Trigger组的信息 |
QRTZSCHEDULERSTATE |
存储少量的有关Scheduler的状态信息,和别的Scheduler实例 |
QRTZ_LOCKS |
存储程序的悲观锁的信息 |
QRTZJOBDETAILS |
存储每一个已配置的Job的详细信息 |
QRTZJOBLISTENERS |
存储有关已配置的JobListener的信息 |
QRTZSIMPLETRIGGERS |
存储简单的Trigger,包括重复次数、间隔、以及已触的次数 |
QRTZBLOGTRIGGERS |
Trigger作为Blob类型存储 |
QRTZTRIGGERLISTENERS |
存储已配置的TriggerListener的信息 |
QRTZ_TRIGGERS |
存储已配置的Trigger的信息 |
本文统一使用Cron方式来创建。
注意:cron方式需要用到的4张数据表:qrtztriggers,qrtzcrontriggers,qrtzfiredtriggers,qrtzjob_details。
整合项目
创建一个SpringBoot项目然后加入quartz依赖,同时也要加入c3p0的依赖因为quartz使用的数据库是和项目分开的。
<!--spring boot集成quartz-->
<dependency>
<groupId>org.springframework.boot</groupId>