springboot项目整合分布式定时任务quartz详解

创作背景

        在常规的业务中,定时任务的应用还是非常广泛的,例如:定时发送通知、定时推送微信公众号消息、定时去清理一些没用的垃圾文件、定时去做某些数据量比较大的统计等等。都是使用到定时任务,所以熟练掌握一门定时任务还是很有必要的。本文会详细说明从无到配置好quartz的整个流程。

quartz简介

        Quartz是OpenSymphony开源组织在Job scheduling领域的一个开源项目,不同于Spring 自带的Scheduled,Quartz可以实现集群部署和分布式调度任务,从而避免在集群环境下,会导致任务被重复调度的问题,在多服务节点下,每一个节点上的quartz都是一个独立的应用。通过数据库锁的方式来保证每个节点的任务只有一个运行。

quartz主体结构

        Job:表示一个要执行的任务

        Jobdetail:表示一个具体的可执行的调度程序,包含了要执行任务的信息

        Trigger:触发器,决定任务什么时候被调用

        Scheduler:调度器,将Jobdetail跟Trigger绑定,定时的去执行Jobdetail中的任务信息

quartz实践

1.创建quartz相关的表

         项目中引入quartz首先要在对应服务的数据库里面创建对应的表,数据库表结构官网已经提供,直接访问Quartz对应的官方网站,找到对应的版本,将建表脚本下载,然后在数据库运行即可,由于我使用的数据库是mysql-5.7,因此我选择的是tables_mysql_innodb.sql脚本,具体脚本内容如下:



CREATE TABLE IF NOT EXISTS my_test.qrtz_job_details
(
    sched_name        VARCHAR(120) NOT NULL,
    job_name          VARCHAR(200) NOT NULL,
    job_group         VARCHAR(200) NOT NULL,
    description       VARCHAR(250) DEFAULT 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,
    PRIMARY KEY (sched_name, job_name, job_group) USING BTREE,
    KEY idx_qrtz_j_req_recovery (sched_name, requests_recovery) USING BTREE,
    KEY idx_qrtz_j_grp (sched_name, job_group) USING BTREE
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS my_test.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) DEFAULT NULL,
    next_fire_time BIGINT(20)   DEFAULT NULL,
    prev_fire_time BIGINT(20)   DEFAULT NULL,
    priority       INT(11)      DEFAULT NULL,
    trigger_state  VARCHAR(16)  NOT NULL,
    trigger_type   VARCHAR(8)   NOT NULL,
    start_time     BIGINT(20)   NOT NULL,
    end_time       BIGINT(20)   DEFAULT NULL,
    calendar_name  VARCHAR(200) DEFAULT NULL,
    misfire_instr  SMALLINT(6)  DEFAULT NULL,
    job_data       BLOB,
    PRIMARY KEY (sched_name, trigger_name, trigger_group) USING BTREE,
    KEY idx_qrtz_t_g (sched_name, trigger_group) USING BTREE,
    KEY idx_qrtz_t_n_state (sched_name, trigger_name, trigger_group, trigger_state) USING BTREE,
    KEY idx_qrtz_t_nft_st (sched_name, trigger_state, next_fire_time) USING BTREE,
    KEY idx_qrtz_t_nft_st_misfire (sched_name, misfire_instr, next_fire_time, trigger_state) USING BTREE,
    KEY idx_qrtz_t_c (sched_name, calendar_name) USING BTREE,
    KEY idx_qrtz_t_next_fire_time (sched_name, next_fire_time) USING BTREE,
    KEY idx_qrtz_t_n_g_state (sched_name, trigger_group, trigger_state) USING BTREE,
    KEY idx_qrtz_t_nft_misfire (sched_name, misfire_instr, next_fire_time) USING BTREE,
    KEY idx_qrtz_t_jg (sched_name, job_group) USING BTREE,
    KEY idx_qrtz_t_nft_st_misfire_grp (sched_name, misfire_instr, next_fire_time, trigger_group, trigger_state) USING BTREE,
    KEY idx_qrtz_t_state (sched_name, trigger_state) USING BTREE,
    KEY idx_qrtz_t_j (sched_name, job_name, job_group) USING BTREE,
    CONSTRAINT qrtz_triggers_ibfk_1 FOREIGN KEY (sched_name, job_name, job_group) REFERENCES qrtz_job_details (sched_name, job_name, job_group) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS my_test.qrtz_blob_triggers
(
    sched_name    VARCHAR(120) NOT NULL,
    trigger_name  VARCHAR(200) NOT NULL,
    trigger_group VARCHAR(200) NOT NULL,
    blob_data     BLOB,
    PRIMARY KEY (sched_name, trigger_name, trigger_group) USING BTREE,
    KEY sched_name (sched_name,trigger_name,trigger_group) USING BTREE,
    CONSTRAINT qrtz_blob_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS my_test.qrtz_calendars
(
    sched_name    VARCHAR(120) NOT NULL,
    calendar_name VARCHAR(200) NOT NULL,
    calendar      BLOB         NOT NULL,
    PRIMARY KEY (sched_name, calendar_name) USING BTREE
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS my_test.qrtz_cron_triggers
(
    sched_name      VARCHAR(120) NOT NULL,
    trigger_name    VARCHAR(200) NOT NULL,
    trigger_group   VARCHAR(200) NOT NULL,
    cron_expression VARCHAR(120) NOT NULL,
    time_zone_id    VARCHAR(80) DEFAULT NULL,
    PRIMARY KEY (sched_name, trigger_name, trigger_group) USING BTREE,
    CONSTRAINT qrtz_cron_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS my_test.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(20)   NOT NULL
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值