• Quartz集群


    1、quartz的集群或者说高可用是通过数据库行锁实现的,所以,quartz的高可用性能其实并不高,但是可以适用大部分的中小型定时任务场景。

    2、重要:根据官网说明,不要在同一个节点上启用集群,原因大约就是时钟的问题。

    3、quartz集群与单节点实现上,主要差别是在配置文件上。Quartz实现动态定时任务

    4、集群配置:

    spring:  
      # 非集群方式以下关于quartz的配置都可以删除
      quartz:
        # 集群名称,相同的名字归属同一个集群
        scheduler-name: wood-cluster
        # Job 存储器类型。默认为 memory 表示内存,集群选 jdbc 使用数据库。
        job-store-type: jdbc
        jdbc:
          # 使用 JDBC 的 JobStore 的时候,是否自动使用 SQL 初始化 Quartz 表结构。
          initialize-schema: never
        # Quartz 是否自动启动
        auto-startup: true
        # 延迟 N 秒启动
        startup-delay: 0
        # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
        wait-for-jobs-to-complete-on-shutdown: true
        # 是否覆盖已有 Job 的配置
        overwrite-existing-jobs: false
        properties:
          org:
            quartz:
              scheduler:
                instanceName: wood-instance
                instanceId: AUTO
              # JobStore 相关配置
              jobStore:
                # 数据源名称
                dataSource: dataSource # 使用的数据源
                class: org.quartz.impl.jdbcjobstore.JobStoreTX # JobStore 实现类
                # oracle换成: OracleDelegate
                driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
                txIsolationLevelSerializable: true
                tablePrefix: qrtz_ # Quartz 表前缀
                isClustered: true # 是集群模式
                clusterCheckinInterval: 15000
                useProperties: false
              # 线程池相关配置
              threadPool:
                threadCount: 25 # 线程池大小。默认为 10 。
                threadPriority: 5 # 线程优先级
                class: org.quartz.simpl.SimpleThreadPool # 线程池类型

    5、由于定时任务持久化到数据库里,quartz会在程序启动时自动加载定时任务,所以应用自定义job_info任务表需要有同步操作。比如job_info手动调整了enable状态,其实对于quartz来说是不可见的。

         例如:因为某种原因停止了应用,并且手动将job_info里的任务设置为false或者删除,但是quartz自管理里表里还有任务,所以定时任务还是会在应用启动侯开启。所以需要在程序启动检测所有有效任务,并删除无效任务,

                   并且,不要手动去删除job_info里定时任务,否则需要手动删除QRTZ_系列表里的任务。

        public void addSerialJob(JobInfo jobInfo){
            // 如果使用了数据库集群或者数据库持久化,则需要手动同步job_info表和qrtz_各类表的同步。
            if(!jobInfo.getEnable()){
                deleteJob(jobInfo);
                return;
            }
            JobDetail jobDetail = JobBuilder.newJob(QuartzSerialJob.class)
                    .storeDurably()
                    .withIdentity(JOB_NAME + jobInfo.getId())
                    .build();
    
            CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                    .withIdentity(JOB_NAME + jobInfo.getId())
                    .startNow()
                    .withSchedule(CronScheduleBuilder.cronSchedule(jobInfo.getCronExpression()))
                    .build();
            cronTrigger.getJobDataMap().put(JobConstant.JOB_KEY,jobInfo);
    
            try {
                JobDetail checked = scheduler.getJobDetail(JobKey.jobKey(JOB_NAME + jobInfo.getId()));
                if(checked==null){
                    scheduler.scheduleJob(jobDetail,cronTrigger);
                }
            } catch (SchedulerException e) {
                log.error("创建定时任务失败:"+jobInfo.toString());
                e.printStackTrace();
                throw new CommonException(StatusCode.ERROR,"创建定时任务失败:"+jobInfo.toString());
            }
        }

    6、quartz自管理任务表

    CREATE TABLE QRTZ_JOB_DETAILS(
                                     SCHED_NAME VARCHAR(120) NOT NULL,
                                     JOB_NAME VARCHAR(190) NOT NULL,
                                     JOB_GROUP VARCHAR(190) 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;
    
    CREATE TABLE QRTZ_TRIGGERS (
                                   SCHED_NAME VARCHAR(120) NOT NULL,
                                   TRIGGER_NAME VARCHAR(190) NOT NULL,
                                   TRIGGER_GROUP VARCHAR(190) NOT NULL,
                                   JOB_NAME VARCHAR(190) NOT NULL,
                                   JOB_GROUP VARCHAR(190) 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(190) 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;
    
    CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
                                          SCHED_NAME VARCHAR(120) NOT NULL,
                                          TRIGGER_NAME VARCHAR(190) NOT NULL,
                                          TRIGGER_GROUP VARCHAR(190) 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;
    
    CREATE TABLE QRTZ_CRON_TRIGGERS (
                                        SCHED_NAME VARCHAR(120) NOT NULL,
                                        TRIGGER_NAME VARCHAR(190) NOT NULL,
                                        TRIGGER_GROUP VARCHAR(190) NOT NULL,
                                        CRON_EXPRESSION VARCHAR(120) 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;
    
    CREATE TABLE QRTZ_SIMPROP_TRIGGERS
    (
        SCHED_NAME VARCHAR(120) NOT NULL,
        TRIGGER_NAME VARCHAR(190) NOT NULL,
        TRIGGER_GROUP VARCHAR(190) 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;
    
    CREATE TABLE QRTZ_BLOB_TRIGGERS (
                                        SCHED_NAME VARCHAR(120) NOT NULL,
                                        TRIGGER_NAME VARCHAR(190) NOT NULL,
                                        TRIGGER_GROUP VARCHAR(190) NOT NULL,
                                        BLOB_DATA BLOB NULL,
                                        PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
                                        INDEX (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;
    
    CREATE TABLE QRTZ_CALENDARS (
                                    SCHED_NAME VARCHAR(120) NOT NULL,
                                    CALENDAR_NAME VARCHAR(190) NOT NULL,
                                    CALENDAR BLOB NOT NULL,
                                    PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
        ENGINE=InnoDB;
    
    CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
                                              SCHED_NAME VARCHAR(120) NOT NULL,
                                              TRIGGER_GROUP VARCHAR(190) NOT NULL,
                                              PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
        ENGINE=InnoDB;
    
    CREATE TABLE QRTZ_FIRED_TRIGGERS (
                                         SCHED_NAME VARCHAR(120) NOT NULL,
                                         ENTRY_ID VARCHAR(95) NOT NULL,
                                         TRIGGER_NAME VARCHAR(190) NOT NULL,
                                         TRIGGER_GROUP VARCHAR(190) NOT NULL,
                                         INSTANCE_NAME VARCHAR(190) 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(190) NULL,
                                         JOB_GROUP VARCHAR(190) NULL,
                                         IS_NONCONCURRENT VARCHAR(1) NULL,
                                         REQUESTS_RECOVERY VARCHAR(1) NULL,
                                         PRIMARY KEY (SCHED_NAME,ENTRY_ID))
        ENGINE=InnoDB;
    
    CREATE TABLE QRTZ_SCHEDULER_STATE (
                                          SCHED_NAME VARCHAR(120) NOT NULL,
                                          INSTANCE_NAME VARCHAR(190) NOT NULL,
                                          LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
                                          CHECKIN_INTERVAL BIGINT(13) NOT NULL,
                                          PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
        ENGINE=InnoDB;
    
    CREATE TABLE QRTZ_LOCKS (
                                SCHED_NAME VARCHAR(120) NOT NULL,
                                LOCK_NAME VARCHAR(40) NOT NULL,
                                PRIMARY KEY (SCHED_NAME,LOCK_NAME))
        ENGINE=InnoDB;
    
    CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
    CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
    
    CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
    CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
    CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
    CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
    CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
    CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
    CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
    CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
    CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
    CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
    CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
    CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
    
    CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
    CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
    CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
    CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
    CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
    CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
    
    commit;
  • 相关阅读:
    Solution -「ARC 126F」Affine Sort
    Solution -「ABC 219H」Candles
    Solution -「LOCAL」二进制的世界
    Solution Set -「ABC 217」
    Java 封装
    Java 对象和类
    Java 继承
    牛客网MySQL在线编程
    Linux uniq命令
    Linux 单引号、双引号、反引号
  • 原文地址:https://www.cnblogs.com/asker009/p/13693107.html
Copyright © 2020-2023  润新知