• SpringBoot - 集成Quartz框架之Quartz简介


    Quartz是什么?

    QUARTZ主页
    QUARTZ官网-相关文档
    QUARTZ官网-配置说明文档
    SPRINGBOOT官方文档
    Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.

    Quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合,也可以单独使用,Quartz可以用来创建简单或复杂的日程序表。
    Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。
    Quartz有一个小JAVA库发布文件,这个库文件包含了所有Quartz核心功能,这些功能的主要接口是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。

    核心要素

    Job:表示一个任务,是定时任务的主体,也是写业务逻辑的地方,如:取消订单、发送邮件等。
    JobDetail:表示一个具体的可执行的调度程序,还包含了任务调度的方案和策略,而Job 是该程序所要执行的具体逻辑内容。
    Trigger:触发器用来定义任务的执行规则的,如几点执行,几点结束,每隔几分钟执行一次等等。
    Scheduler:用来调度任务的,主要用于启动、停止、暂停、恢复等操作,一个Scheduler就是一个调度容器,它可以注册多个 JobDetail 和Trigger,当JobDetail 与 Trigger 组合后,就可以被 Scheduler 容器调度了。

    (1)JobDetail:用于定义作业的实例
    (2)Trigger:触发器, 执行给定作业计划的组件实例,主要提供了四种类型的触发器:SimpleTrigger、CronTirgger、DateIntervalTrigger和NthIncludedDayTrigger。
    (3)Scheduler:与调度程序交互的主要的API,是实际执行调度的控制器
    (4)CronScheduleBuilder:用于创建一个Scheduler的生成器
    (5)何时触发:通过Trigger来定义, 使用TriggerBuilder进行构建
    (6)什么任务:通过JobDetail来定义, 使用JobBuilder进行构建
    (7)执行逻辑:通过JOB中的doExecute方法的具体实现, 执行具体的内容
    (8)Job接口是真正需要执行的业务逻辑,可以将JobDetail接口理解为是对Job接口的包装,Trigger和Scheduler实际用到的都是JobDetail。

    各个核心要素质检的关系:
    在这里插入图片描述

    调度线程

    在 Quartz 中,有两类线程,控制器调度线程和任务执行线程,其中任务执行线程通常使用一个线程池维护一组线程。
    在这里插入图片描述
    控制器调度线程主要有两个: 执行常规调度的线程,和执行 misfired trigger 的线程。常规调度线程轮询存储的所有触发器,如果有需要触发的触发器,即到达了下一次触发的时间,则从任务执行线程池获取一个空闲线程,执行与该触发器关联的任务。Misfire 线程是扫描所有的触发器,查看是否有 misfired trigger,如果存在则根据 misfire 的策略分别处理。
    在这里插入图片描述

    数据存储

    Quartz 中的触发器和任务需要存储下来才能被使用,Quartz 中有两种存储方式:RAMJobStore, JobStoreSupport,其中 RAMJobStore 是将触发器和任务存储在内存中,而 JobStoreSupport 是基于JDCB将触发器和任务存储到数据库中。
    在 Quartz 中,JobStoreSupport 使用一个驱动代理来操作触发器和任务的数据存储:StdJDBCDelegate。StdJDBCDelegate 实现了大部分基于标准 JDBC 的功能接口,但是对于各种数据库来说,需要根据其具体实现的特点做某些特殊处理,因此各种数据库需要扩展 StdJDBCDelegate 以实现这些特殊处理,Quartz 已经自带了一些数据库的扩展实现,可以直接使用。

    依赖说明

    第一种方式(SpringBoot根据自身的版本来选择合适的quartz版本):

    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-quartzartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    第二种方式(可以灵活选择quartz的版本,当然也可以使用SpringBoot默认的版本):

    
    <dependency>
        <groupId>org.quartz-schedulergroupId>
        <artifactId>quartzartifactId>
        <version>2.3.2version>
        <exclusions>
          <exclusion>
            <groupId>com.mchangegroupId>
            <artifactId>c3p0artifactId>
          exclusion>
          <exclusion>
            <groupId>com.zaxxergroupId>
            <artifactId>*artifactId>
          exclusion>
        exclusions>
    dependency>
    <dependency>
        <groupId>org.quartz-schedulergroupId>
        <artifactId>quartz-jobsartifactId>
        <version>2.3.2version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    属性说明

    1)org.quartz.jobStore.driverDelegateClass,用于指定任务持久化的数据库的驱动,可选的值如下:
    org.quartz.impl.jdbcjobstore.StdJDBCDelegate(用于完全符合JDBC的驱动程序)
    org.quartz.impl.jdbcjobstore.MSSQLDelegate(对于Microsoft SQL ServerSybaseorg.quartz.impl.jdbcjobstore.PostgreSQLDelegate
    org.quartz.impl.jdbcjobstore.WebLogicDelegate(对于WebLogic驱动程序)
    org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
    org.quartz.impl.jdbcjobstore.oracle.WebLogicOracleDelegate(对于Weblogic中使用的Oracle驱动程序)
    org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate(对于在Weblogic中使用的Oracle驱动程序)
    org.quartz.impl.jdbcjobstore.CloudscapeDelegate
    org.quartz.impl.jdbcjobstore.DB2v6Delegate
    org.quartz.impl.jdbcjobstore.DB2v7Delegate
    org.quartz.impl.jdbcjobstore.DB2v8Delegate
    org.quartz.impl.jdbcjobstore.HSQLDBDelegate
    org.quartz.impl.jdbcjobstore.PointbaseDelegate
    org.quartz.impl.jdbcjobstore.SybaseDelegate
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    表结构

    以前有12张表,现在只有11张表,现在没有存储触发器监听器的表(qrtz_trigger_listeners),增加了qrtz_simprop_triggers 表:

    序号表名描述
    1qrtz_blob_triggers以BLOB类型存储的触发器
    2qrtz_calendars存放日历信息,QUARTZ可以配置一个日历来指定一个时间范围
    3qrtz_cron_triggers存放CRON类型的触发器
    4qrtz_fired_triggers存放已触发的触发器
    5qrtz_job_details存放jobDetail的信息
    6qrtz_locks存放程序的悲观锁的信息(假如使用了悲观锁)
    7qrtz_paused_trigger_graps存放暂停掉的触发器
    8qrtz_scheduler_state存放调度器状态
    9qrtz_simple_triggers存放简单的触发器
    10qrtz_simprop_triggers存放简单触发器的详细信息
    11qrtz_triggers存放触发器的基本信息

    SQL语句

    -- ----------------------------
    -- ①. JOB_DETAILS详细信息表
    -- ----------------------------
    drop table if exists QRTZ_JOB_DETAILS;
    create table QRTZ_JOB_DETAILS (
        sched_name           varchar(120)    not null,
        job_name             varchar(200)    not null,
        job_group            varchar(200)    not null,
        description          varchar(250)    null,
        job_class_name       varchar(250)    not null,
        is_durable           varchar(1)      not null,
        is_nonconcurrent     varchar(1)      not null,
        is_update_data       varchar(1)      not null,
        requests_recovery    varchar(1)      not null,
        job_data             blob            null,
        primary key (sched_name,job_name,job_group)
    ) engine=innodb;
    
    -- ----------------------------
    -- ②. 触发器详细信息表, 存储已配置的Trigger的信息
    -- ----------------------------
    drop table if exists QRTZ_TRIGGERS;
    create table QRTZ_TRIGGERS (
        sched_name           varchar(120)    not null,
        trigger_name         varchar(200)    not null,
        trigger_group        varchar(200)    not null,
        job_name             varchar(200)    not null,
        job_group            varchar(200)    not null,
        description          varchar(250)    null,
        next_fire_time       bigint(13)      null,
        prev_fire_time       bigint(13)      null,
        priority             integer         null,
        trigger_state        varchar(16)     not null,
        trigger_type         varchar(8)      not null,
        start_time           bigint(13)      not null,
        end_time             bigint(13)      null,
        calendar_name        varchar(200)    null,
        misfire_instr        smallint(2)     null,
        job_data             blob            null,
        primary key (sched_name,trigger_name,trigger_group),
        foreign key (sched_name,job_name,job_group) references QRTZ_JOB_DETAILS(sched_name,job_name,job_group)
    ) engine=innodb;
    
    -- ----------------------------
    -- ③. 简单触发器详细信息表, 与触发器表进行关联. 存储的信息包括重复次数、间隔、以及已触发的次数
    -- ----------------------------
    drop table if exists QRTZ_SIMPLE_TRIGGERS;
    create table QRTZ_SIMPLE_TRIGGERS (
        sched_name           varchar(120)    not null,
        trigger_name         varchar(200)    not null,
        trigger_group        varchar(200)    not null,
        repeat_count         bigint(7)       not null,
        repeat_interval      bigint(12)      not null,
        times_triggered      bigint(10)      not null,
        primary key (sched_name,trigger_name,trigger_group),
        foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
    ) engine=innodb;
    
    -- ----------------------------
    -- ④. CRON触发器详细信息表, 与触发器表进行关联. 存储的信息包括CRON表达式和时区信息
    -- ----------------------------
    drop table if exists QRTZ_CRON_TRIGGERS;
    create table QRTZ_CRON_TRIGGERS (
        sched_name           varchar(120)    not null,
        trigger_name         varchar(200)    not null,
        trigger_group        varchar(200)    not null,
        cron_expression      varchar(200)    not null,
        time_zone_id         varchar(80),
        primary key (sched_name,trigger_name,trigger_group),
        foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
    ) engine=innodb;
    
    -- ----------------------------
    -- ⑤. 自定义触发器详细信息表, Trigger 作为 Blob 类型存储(使用用JDBC创建自定义的TRIGGER类型, JobStore 并不知道如何存储实例的时候)
    -- ----------------------------
    drop table if exists QRTZ_BLOB_TRIGGERS;
    create table QRTZ_BLOB_TRIGGERS (
        sched_name           varchar(120)    not null,
        trigger_name         varchar(200)    not null,
        trigger_group        varchar(200)    not null,
        blob_data            blob            null,
        primary key (sched_name,trigger_name,trigger_group),
        foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
    ) engine=innodb;
    
    -- ----------------------------
    -- ⑥. 日历信息表, 使用BLOB类型存储存放日历信息, QUARTZ可配置一个日历来指定一个时间范围
    -- ----------------------------
    drop table if exists QRTZ_CALENDARS;
    create table QRTZ_CALENDARS (
        sched_name           varchar(120)    not null,
        calendar_name        varchar(200)    not null,
        calendar             blob            not null,
        primary key (sched_name,calendar_name)
    ) engine=innodb;
    
    -- ----------------------------
    -- ⑦. 存储已暂停的触发器组的信息
    -- ----------------------------
    drop table if exists QRTZ_PAUSED_TRIGGER_GRPS;
    create table QRTZ_PAUSED_TRIGGER_GRPS (
        sched_name           varchar(120)    not null,
        trigger_group        varchar(200)    not null,
        primary key (sched_name,trigger_group)
    ) engine=innodb;
    
    -- ----------------------------
    -- ⑧. 存储与已触发的触发器相关的状态信息, 以及相关联的JOB的执行信息
    -- ----------------------------
    drop table if exists QRTZ_FIRED_TRIGGERS;
    create table QRTZ_FIRED_TRIGGERS (
        sched_name           varchar(120)    not null,
        entry_id             varchar(95)     not null,
        trigger_name         varchar(200)    not null,
        trigger_group        varchar(200)    not null,
        instance_name        varchar(200)    not null,
        fired_time           bigint(13)      not null,
        sched_time           bigint(13)      not null,
        priority             integer         not null,
        state                varchar(16)     not null,
        job_name             varchar(200)    null,
        job_group            varchar(200)    null,
        is_nonconcurrent     varchar(1)      null,
        requests_recovery    varchar(1)      null,
        primary key (sched_name,entry_id)
    ) engine=innodb;
    
    -- ----------------------------
    -- ⑨. 存储少量的有关调度器(SCHEDULER)的状态信息, 假如是用于集群中, 可以看到其他的SCHEDULER实例
    -- ----------------------------
    drop table if exists QRTZ_SCHEDULER_STATE;
    create table QRTZ_SCHEDULER_STATE (
        sched_name           varchar(120)    not null,
        instance_name        varchar(200)    not null,
        last_checkin_time    bigint(13)      not null,
        checkin_interval     bigint(13)      not null,
        primary key (sched_name,instance_name)
    ) engine=innodb;
    
    -- ----------------------------
    -- ⑩. 存储程序的悲观锁的信息(假如使用了悲观锁)
    -- ----------------------------
    drop table if exists QRTZ_LOCKS;
    create table QRTZ_LOCKS (
        sched_name           varchar(120)    not null,
        lock_name            varchar(40)     not null,
        primary key (sched_name,lock_name)
    ) engine=innodb;
    
    -- ----------------------------
    -- 11. 简单触发器详细信息表, 与触发器表进行关联
    -- ----------------------------
    
    drop table if exists QRTZ_SIMPROP_TRIGGERS;
    create table QRTZ_SIMPROP_TRIGGERS (
        sched_name           varchar(120)    not null,
        trigger_name         varchar(200)    not null,
        trigger_group        varchar(200)    not null,
        str_prop_1           varchar(512)    null,
        str_prop_2           varchar(512)    null,
        str_prop_3           varchar(512)    null,
        int_prop_1           int             null,
        int_prop_2           int             null,
        long_prop_1          bigint          null,
        long_prop_2          bigint          null,
        dec_prop_1           numeric(13,4)   null,
        dec_prop_2           numeric(13,4)   null,
        bool_prop_1          varchar(1)      null,
        bool_prop_2          varchar(1)      null,
        primary key (sched_name,trigger_name,trigger_group),
        foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
    ) engine=innodb;
    
    commit;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174

    其他文章

    SpringBoot - 集成Quartz框架之CRON表达式
    SpringBoot - 集成Quartz框架之Quartz简介(一)
    SpringBoot - 集成Quartz框架之常用配置(二)
    SpringBoot - 集成Quartz框架之具体步骤(三)
    SpringBoot - 集成Quartz框架之独立数据源(四)
    SpringBoot - 集成Quartz框架之常见问题(五)
    SpringBoot - 集成Quartz框架之@DisallowConcurrentExecution注解详解(六)

  • 相关阅读:
    volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗?
    【国际竞赛-计算机篇】2022年高含金量的计算机竞赛有哪些
    骑行听音乐用什么耳机,盘点几款适合在出行佩戴的耳机
    文举论金:黄金原油全面走势分析策略指导。
    LED点灯
    VUE3 -- v-model理解:
    JKChangeCapture swift 版本的捕捉属性变化的工具
    SpringBoot mvc返回中文会变问号
    Mac实现Gitlab CICD
    vue学习笔记23-组件事件⭐
  • 原文地址:https://blog.csdn.net/goodjava2007/article/details/126843315