type
status
date
Jul 26, 2024 04:02 AM
slug
summary
category
tags
password
icon
概述
Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。
它有很多特征,如:数据库支持,集群,插件,EJB 作业预构建,JavaMail 及其它,支持 cron-like 表达式等等。
在 Quartz 体系结构中,有三个组件非常重要:
Scheduler
:调度器
Trigger
:触发器
Job
:任务
Quartz 分成单机模式和集群模式。
- 先学习下 Quartz 的单机模式,入门比较快。
- 再学习下 Quartz 的集群模式。在生产环境下,一定要使用 Quartz 的集群模式,保证定时任务的高可用。
Quartz 单机
引入Maven依赖
示例Job
DemoJob01
- 继承 QuartzJobBean 抽象类,实现
#executeInternal(JobExecutionContext context)
方法,执行自定义的定时任务的逻辑。
- QuartzJobBean 实现了
org.quartz.Job
接口,提供了 Quartz 每次创建 Job 执行定时逻辑时,将该 Job Bean 的依赖属性注入。例如说,DemoJob01 需要@Autowired
注入的demoService
属性,核心代码如下:
DemoJob02
ScheduleConfiguration
- DemoJob01Configuration
#demoJob01()
方法,创建 DemoJob01 的 JobDetail Bean 对象。#demoJob01Trigger()
方法,创建 DemoJob01 的 Trigger Bean 对象。其中,我们使用 SimpleScheduleBuilder 简单的调度计划的构造器,创建了每 5 秒执行一次,无限重复的调度计划。
- DemoJob2Configuration
#demoJob2()
方法,创建 DemoJob02 的 JobDetail Bean 对象。#demoJob02Trigger()
方法,创建 DemoJob02 的 Trigger Bean 对象。其中,我们使用 CronScheduleBuilder 基于 Quartz Cron 表达式的调度计划的构造器,创建了每 10 秒执行一次的调度计划。
测试
- 可以看到,对于 DemoJob01 ,每 5 秒左右执行一次。同时我们可以看到,
demoService
成功注入,而counts
每次都是 1 ,说明每次 DemoJob01 都是新创建的。
- 对于 DemoJob02 ,每 10 秒执行一次。
配置文件
- 在
spring.quartz
配置项,Quartz 的配置,对应 QuartzProperties 配置类。
- Spring Boot QuartzAutoConfiguration 自动化配置类,实现 Quartz 的自动配置,创建 Quartz Scheduler(调度器)Bean 。
注意,
spring.quartz.wait-for-jobs-to-complete-on-shutdown
配置项,是为了实现 Quartz 的优雅关闭,建议开启。实际场景下,我们必然需要考虑定时任务的高可用,所以基本上肯定使用 Quartz 的集群方案,集群方案使用Quartz 的 JDBC 存储器 JobStoreTX ,并是使用 MySQL 作为数据库,而不是单机方案的Memory。
- 作者:Frank
- 链接:https://blog.franksteven.me//article/quartz_standalone
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。