• JobStore使用


    • JobStore

      JobStore负责跟踪提供给调度程序的所有的工作数据,包括:Jobs,triggers,日历等信息。其中quartz的存储方式有分为RAM和JDBC两种方式。

      • RAMJobStore

        RAMJobStore是使用最简单的JobStore,它也是性能最高的(在CPU时间方面)。RAMJobStore以其明显的方式获取其名称:它将其所有数据保存在RAM中。这就是为什么它是闪电般快的,也是为什么这么简单的配置。缺点是当您的应用程序结束(或崩溃)时,所有调度信息都将丢失 - 这意味着RAMJobStore无法履行作业和triggers上的“非易失性”设置。对于某些应用程序,这是可以接受的 - 甚至是所需的行为,但对于其他应用程序,这可能是灾难性的。

        quartz框架默认的方式采用RAM的配置方式,具体的配置文件在 org/quartz/.quartz.properties中有一条如下:

        org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
        
      • JDBC JobStore

        JDBCJobStore也被恰当地命名 - 它通过JDBC将其所有数据保存在数据库中。因此,配置比RAMJobStore要复杂一点,而且也不是那么快。但是,性能下降并不是很糟糕,特别是如果您在主键上构建具有索引的数据库表。在相当现代的一套具有体面的LAN(在调度程序和数据库之间)的机器上,检索和更新触发triggers的时间通常将小于10毫秒。

        JDBCJobStore几乎与任何数据库一起使用,已被广泛应用于Oracle,PostgreSQL,MySQL,MS SQLServer,HSQLDB和DB2。要使用JDBCJobStore,必须首先创建一组数据库表以供Quartz使用。您可以在Quartz发行版的“docs / dbTables”目录中找到表创建SQL脚本。如果您的数据库类型尚未有脚本,请查看其中一个脚本,然后以数据库所需的任何方式进行修改。需要注意的一点是,在这些脚本中,所有的表都以前缀“QRTZ_”开始(如表“QRTZ_TRIGGERS”和“QRTZ_JOB_DETAIL”)。只要你通知JDBCJobStore前缀是什么(在你的Quartz属性中),这个前缀实际上可以是你想要的。对于多个调度程序实例,使用不同的前缀可能有助于创建多组表。

        在使用JDBC的时候需要首先数据库中创建表,关于数据库的脚本可以从quartz框架中org/quartz、impl/jdbcjobstore中查找相关的脚本。

      • 下面是采用JDBC jobStore的demo

      数据库脚本

      DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
      DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
      DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
      DROP TABLE IF EXISTS QRTZ_LOCKS;
      DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
      DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
      DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
      DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
      DROP TABLE IF EXISTS QRTZ_TRIGGERS;
      DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
      DROP TABLE IF EXISTS QRTZ_CALENDARS;
      
      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;
      

      quartz.properties配置信息

      #上面的配置为quartz的默认配置
      #调度标识名 集群中每一个实例都必须使用相同的名称 (区分特定的调度器实例)
      org.quartz.scheduler.instanceName:DefaultQuartzScheduler
      #ID设置为自动获取 每一个必须不同 (所有调度器实例中是唯一的)
      org.quartz.scheduler.instanceId: AUTO
      #数据保存方式为持久化
      org.quartz.jobStore.class :org.quartz.impl.jdbcjobstore.JobStoreTX
      #表的前缀
      org.quartz.jobStore.tablePrefix : QRTZ_
      #设置为TRUE不会出现序列化非字符串类到 BLOB 时产生的类版本问题
      //org.quartz.jobStore.useProperties : true
      #加入集群 true 为集群 false不是集群
      org.quartz.jobStore.isClustered : false
      #调度实例失效的检查时间间隔
      org.quartz.jobStore.clusterCheckinInterval:20000
      #容许的最大作业延长时间
      org.quartz.jobStore.misfireThreshold :60000
      #ThreadPool 实现的类名
      org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool
      #线程数量
      org.quartz.threadPool.threadCount: 10
      #线程优先级
      org.quartz.threadPool.threadPriority : 5
      #(threadPriority 属性的最大值是常量 java.lang.Thread.MAX_PRIORITY,等于10。最小值为常量 java.lang.Thread.MIN_PRIORITY,为1)
      #自创建父线程
      #org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
      #数据库别名
      org.quartz.jobStore.dataSource : qzDS
      #设置数据源
      org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
      org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz
      org.quartz.dataSource.qzDS.user:root
      org.quartz.dataSource.qzDS.password:root
      org.quartz.dataSource.qzDS.maxConnections:10
      

      java相关代码

      public class JdbcJob implements Job {
          @Override
          public void execute(JobExecutionContext context) throws JobExecutionException {
      
      
              System.out.println("job执行成功");
          }
      
      }
      
      public class JdbcJobMain {
      
          public static void main(String[] args) throws Exception {
          
              Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
          
              JobDetail jobDetail = JobBuilder.newJob(JdbcJob.class).withDescription("测试JOB").withIdentity("job1", "group1").build();
          
              Trigger trigger = TriggerBuilder.newTrigger()
                      .withDescription("trigger")
                      .withIdentity("trigger1", "trigger1")
                      .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))
                      .build();
          
              scheduler.scheduleJob(jobDetail, trigger);
              scheduler.start();
      
      
              Thread.sleep(Long.MAX_VALUE);
          
              scheduler.shutdown(true);
      
      
          }
      
      }
      

      相关源码参考: https://github.com/albert-liu435/springquartz
      源码分析可以参考这篇文章: https://www.jianshu.com/p/760a96048e3c

  • 相关阅读:
    手机摇一摇代码
    ftp
    .net 设置导航的当前状态
    app 尺寸
    繁简体 互转 js
    静态页分页效果
    判断浏览器
    python列表,元组,字典和字符串之间的相互转换
    uliweb框架数据库操作
    uliweb的模版
  • 原文地址:https://www.cnblogs.com/haizhilangzi/p/12217142.html
Copyright © 2020-2023  润新知