⏲️定时任务(2):Quartz 单机
00 分钟
2024-7-25
2024-7-26
type
status
date
Jul 26, 2024 04:02 AM
slug
summary
category
tags
password
icon

概述

Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。
它有很多特征,如:数据库支持,集群,插件,EJB 作业预构建,JavaMail 及其它,支持 cron-like 表达式等等。
在 Quartz 体系结构中,有三个组件非常重要:
  1. Scheduler :调度器
  1. Trigger:触发器
  1. Job:任务
Quartz 分成单机模式和集群模式。
  • 先学习下 Quartz 的单机模式,入门比较快。
  •  再学习下 Quartz 的集群模式。在生产环境下,一定要使用 Quartz 的集群模式,保证定时任务的高可用。

Quartz 单机

引入Maven依赖

示例Job

DemoJob01

  1. 继承 QuartzJobBean 抽象类,实现 #executeInternal(JobExecutionContext context) 方法,执行自定义的定时任务的逻辑。
  1. 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 秒执行一次的调度计划。

    测试

    1. 可以看到,对于 DemoJob01 ,每 5 秒左右执行一次。同时我们可以看到,demoService 成功注入,而 counts 每次都是 1 ,说明每次 DemoJob01 都是新创建的。
    1. 对于 DemoJob02 ,每 10 秒执行一次。

    配置文件

    • 在 spring.quartz 配置项,Quartz 的配置,对应 QuartzProperties 配置类。
    注意spring.quartz.wait-for-jobs-to-complete-on-shutdown 配置项,是为了实现 Quartz 的优雅关闭,建议开启。
    实际场景下,我们必然需要考虑定时任务的高可用,所以基本上肯定使用 Quartz 的集群方案,集群方案使用Quartz 的 JDBC 存储器 JobStoreTX ,并是使用 MySQL 作为数据库,而不是单机方案的Memory。

    评论
    Loading...