Quartz任务调度--集群

一.Quartz的工作原理  

   对于一个调度作业,通常有两个因素构成:调度的内容【What】:即调度具体做什么工作,例如是发邮件、系统备份;调度的时间【when】:什么时候工 作,这个又包含两个内容,开始时间【调度第一次执行的时间】,调度时间【在调度开始之后,在什么时间的时候,执行定义的调度工作】。

   Quartz框架提供了Job接口和Trigger接口来分别对应调度的内容和调度时间,由于Job接口和Trigger接口是完全分离的,彼此互不关心,他们之间要建立某种关联,就需要通过Scheduler来帮助他们建立联系。
Quartz启动时,会初始化一套work线程池,这套线程被用于执行预定义的调度作业。Job和Trigger的关联根据配置的不同【基于内存的调度、 基于数据库的调度】而不同:如果是基于内存的调度,那么Job信息和Trigger信息分别放到两个HashMap中,通过RAMJobSupport来 建立关联;如果是基于数据库的调度,Job信息、Tirgger信息以及它们的关联信息都被存到数据库表中。


a.一个简单的调度需要有如下几个步骤:
  1. 定义Job;
  2. 定义Trigger;
  3. 获得Scheduler;
  4. 建立JobDetail对象,通过JodDetail对象实例化Job;
  5. Job和Trigger建立关联;
  6. 开始调度 scheduler.start方法。
需要注意的是第四步,第四步多了一个JobDetail,虽然Job是Quartz的核心组件,但是Scheduler 并不直接和Job打交道,而是通过JobDetail来建立关联,这样的好处是:
  1. 可以将Job分组;
  2. 可以通过访问JobDetail的JobDataMap向Job传递一些运行时参数和属性;

 二.Quartz的Cron表达式

Quartz的Cron表达式字段被扩展到了七个字段,而且最后一个字段并不是要执行的命令:

Quartz的Cron表达式字段
名称是否必须允许值特殊字符
0-59, - * /
0-59, - * /
0-23, - * /
1-31, - * / L W C
1-12或JAN-DEC, - * /
1-7或sun-sat, - * / L C #
空 或 1970-2099, - * /

 关于Cron表达式的字段说明:

  1. 月和周的名称不分大小写;FRI、Fri、fri是一样的;
  2. 关于特殊字符的使用参考Quartz的相关文档,在此不做详细说明。

    例如:有一个调度任务,需要在周一到周五下午16:41执行,则这个Trigger可以按照如下方式建立:

Java代码  收藏代码
  1. Trigger trigger = new CronTrigger("AnotherCronTrigger",null,"0 41 16 ? * MON-FRI");  


三.quartz存储job方式

  quartz定时任务调度,quartz最基本的概念就是job,在job内调用具体service完成具体功能,
  quartz需要把每个job存储起来,方便调度,quartz存储job方式就分三种,
  最常用的也是quartz默认的是RAMJobStore,RAMJobStore顾名思义就是把job的相关信息存储在内存里,
  如果用spring配置quartz的job信息的话,所有信息是配置在xml里,当spirng context启动的时候就把xml里的job信息装入内存。
  这一性质就决定了一旦JVM挂掉或者容器挂掉,内存中的job信息就随之消失,无法持久化。
  
  另外两种方式是JobStoreTX和JobStoreCMT,使用这两种JobStore,
  quartz就会通过jdbc直连或者应用服务器jndi连接数据库,读取配置在数据库里的job初始化信息,
  并且把job通过java序列化到数据库里,这样就使得每个job信息得到了持久化,
  即使在jvm或者容器挂掉的情况下,也能通过数据库感知到job的状态和信息。

 (2)quartz集群各节点之间是通过同一个数据库实例来感知彼此的。 

四.基于数据库的调度的具体步骤:


1. 相关jar包引入

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <spring.version>3.2.8.RELEASE</spring.version>  
  2. <dependency>  
  3.     <groupId>org.springframework</groupId>  
  4.     <artifactId>spring-context-support</artifactId>  
  5.     <version>${spring.version}</version>  
  6. </dependency>  
  7. 等  
  8.   
  9. <!-- quartz -->  
  10. <dependency>  
  11.     <groupId>org.quartz-scheduler</groupId>  
  12.     <artifactId>quartz</artifactId>  
  13.     <version>2.2.1</version>  
  14.     <exclusions><!-- 如果单独引入org.slf4j了,此处去掉 -->  
  15.     <exclusion>  
  16.         <artifactId>slf4j-api</artifactId>  
  17.         <groupId>org.slf4j</groupId>  
  18.     </exclusion>  
  19.     </exclusions>  
  20. </dependency>  
注意:spring与quartz版本;需要引入spring-context-support.jar包

2. java代码

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.taiyang.quartz;  
  2.   
  3. /** 
  4.  * 定时任务执行类--xml文件配置 
  5.  * @author taiyang 
  6.  * 2016-05-25 18:36:02 
  7.  */  
  8. public class TestQuartzCluster implements Job, Serializable{  
  9.       
  10.     private static final long serialVersionUID = -6605766126594260961L;  
  11.       
  12.     @Override  
  13.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  14.         System.out.println("#################################:TestQuarzCluster");  
  15.     }  
  16.       
  17. }  
  18.   
  19. /** 
  20.  * 定时任务管理类 
  21.  * job、trigger、scheduler 
  22.  * @author taiyang 
  23.  * 2016-05-25 18:36:08 
  24.  */  
  25. public class QuartzManager {  
  26.       
  27.     private Scheduler clusterScheduler;//项目启动时注入  
  28.   
  29.     public void init() throws SchedulerException{  
  30.         JobKey jobKey = JobKey.jobKey("customJob_name""customJob_group");  //获取数据库中的实例
  31.         //clusterScheduler = new StdSchedulerFactory().getScheduler();  
  32.         JobDetail jobDetail = clusterScheduler.getJobDetail(jobKey);//xml中配置了  
  33.         TriggerKey triggerKey = TriggerKey.triggerKey("customTrigger_name""customTrigger_group");  
  34.         boolean isExists = clusterScheduler.checkExists(triggerKey);  
  35.         if(isExists){  
  36.             clusterScheduler.unscheduleJob(triggerKey);//停止调度当前Job任务  
  37.         }  
  38.         String cron = (10 % 50) + " 0/1 * ? * *" ;//Cron表达式:每隔一分钟执行一次  
  39.         Assert.isTrue(CronExpression.isValidExpression(cron), "invalid cron = " + cron);  
  40.         Date startDate = new Date(System.currentTimeMillis()+ 1*60*1000);//开始执行时间  
  41.         Map<String, Object> dataMap = new HashMap<String, Object>();//参数  
  42.         dataMap.put("params""taiyang");  
  43.           
  44.         Trigger trigger = TriggerBuilder.newTrigger()  
  45.                 .withIdentity(triggerKey)  
  46.                 .forJob(jobDetail)  
  47.                 .withSchedule(CronScheduleBuilder.cronSchedule(cron))  
  48.                 .startAt(startDate)  
  49.                 .build();  
  50.         trigger.getJobDataMap().putAll(dataMap);//传参  
  51.         clusterScheduler.scheduleJob(trigger);  
  52.     }  
  53.       
  54.     public void setClusterScheduler(Scheduler clusterScheduler) {  
  55.         this.clusterScheduler = clusterScheduler;  
  56.     }  
  57.       
  58. }  
  59.   
  60. /** 
  61.  * 定时任务执行类--动态生成 
  62.  * @author taiyang 
  63.  * 2016-05-25 18:36:06 
  64.  */  
  65. public class CustomQuartzJob implements Job, Serializable{  
  66.       
  67.     private static final long serialVersionUID = -6605766126594260962L;  
  68.       
  69.     @Override  
  70.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  71.         try {  
  72.             SchedulerContext schedulerContext = context.getScheduler().getContext();  
  73.             ApplicationContext applicationContext = (ApplicationContext) schedulerContext.get("applicationContext");  
  74.             // applicationContext.getBean("BeanName");//获取spring bean实例  
  75.             JobDataMap dataMap = context.getMergedJobDataMap();  
  76.             String params = dataMap.getString("params");//获取参数  
  77.             System.out.println("**************************:" + params);  
  78.         } catch (SchedulerException e) {  
  79.             e.printStackTrace();  
  80.         }  
  81.     }  
  82.       
  83. }  

3. spring-quartz.xml

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.                      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"  
  6.        default-autowire="byName">  
  7.   
  8.     <!-- quartz线程池 -->  
  9.     <bean id="quartzThreadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
  10.         <!-- 核心线程数  -->  
  11.         <property name="corePoolSize" value="100"/>  
  12.         <!-- 最大线程数 -->  
  13.         <property name="maxPoolSize" value="200"/>  
  14.         <!-- 队列最大长度 >=mainExecutor.maxSize -->  
  15.         <property name="queueCapacity" value="1000"/>  
  16.         <!-- 线程池维护线程所允许的空闲时间 -->  
  17.         <property name="keepAliveSeconds" value="300"/>  
  18.         <!-- 拒绝任务策略:被拒绝后直接在调用者线程中运行当前被放弃任务 -->  
  19.         <property name="rejectedExecutionHandler">  
  20.             <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>  
  21.         </property>  
  22.     </bean>  
  23.   
  24.     <!-- 分布式QuartzScheduler -->  
  25.     <bean name="clusterScheduler" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  26.         <property name="dataSource" ref="dataSource"></property> <!-- datasource引入 -->  
  27.         <property name="taskExecutor" ref="quartzThreadPool"/>  
  28.         <property name="transactionManager" ref="transactionManager"/><!-- transactionManager引入 -->  
  29.         <property name="quartzProperties">  
  30.             <props>  
  31.                 <prop key="org.quartz.scheduler.instanceName">CacheCloudScheduler</prop>  
  32.                 <prop key="org.quartz.scheduler.instanceId">AUTO</prop>  
  33.                 <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>  
  34.                 <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>       
  35.                 <prop key="org.quartz.jobStore.tablePrefix">CACHE_QRTZ_</prop><!-- 表名前缀 -->  
  36.                 <prop key="org.quartz.jobStore.isClustered">${isClustered}</prop>  
  37.                 <prop key="org.quartz.jobStore.clusterCheckinInterval">15000</prop>  
  38.                 <prop key="org.quartz.jobStore.maxMisfiresToHandleAtATime">120</prop>  
  39.                 <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>  
  40.                 <prop key="org.quartz.scheduler.jmx.export">true</prop><!-- 打开JMX 配置 -->  
  41.                 <prop key="org.quartz.plugin.shutdownHook.class">org.quartz.plugins.management.ShutdownHookPlugin</prop>  
  42.                 <prop key="org.quartz.plugin.shutdownHook.cleanShutdown">true</prop>  
  43.                 <prop key="org.terracotta.quartz.skipUpdateCheck">true</prop>  
  44.                 <prop key="org.quartz.plugin.triggHistory.class">org.quartz.plugins.history.LoggingJobHistoryPlugin</prop>  
  45.             </props>  
  46.         </property>  
  47.         <property name="schedulerName" value="CacheCloudScheduler"/>  
  48.         <property name="applicationContextSchedulerContextKey" value="applicationContext"/>  
  49.         <property name="overwriteExistingJobs" value="true"/>  
  50.         <property name="waitForJobsToCompleteOnShutdown" value="false"/>  
  51.         <property name="startupDelay" value="0"/>  
  52.         <property name="autoStartup" value="true"/>  
  53.         <property name="triggers">  
  54.             <array>  
  55.                <ref bean="testQuarzClusterTrigger"/>  
  56.             </array>  
  57.         </property>  
  58.         <property name="jobDetails">  
  59.             <array>  
  60.                 <ref bean="testQuarzClusterJobDetail"/>  
  61.                 <ref bean="customJobDetail"/>  
  62.             </array>  
  63.         </property>  
  64.     </bean>  
  65.   
  66.     <!-- start 每隔1分钟 -->  
  67.     <bean id="testQuarzClusterTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
  68.         <property name="name" value="testQuarzClusterTrigger"/>  
  69.         <property name="group" value="testQuarzCluster"/>  
  70.         <property name="jobDetail" ref="testQuarzClusterJobDetail"/>  
  71.         <property name="cronExpression" value="0 */1 * * * ?"/>  
  72.     </bean>  
  73.     <bean id="testQuarzClusterJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">  
  74.         <property name="name" value="instanceStatusJob"></property>  
  75.         <property name="group" value="instance"></property>  
  76.         <property name="jobClass" value="com.taiyang.quartz.TestQuartzCluster"></property>  
  77.         <property name="requestsRecovery" value="true" /><!-- spring-context-support 3.2.8.RELEASE支持,低版本可能报错 -->  
  78.         <property name="durability" value="true"/>  
  79.     </bean>  
  80.     <!-- end 每隔1分钟 -->  
  81.       
  82.     <!-- start customJob -->  
  83.     <!-- [只创建JobDetail,Trigger在QuartzManager中管理,实现动态][JobDetail也可以在QuartzManager中实现] -->  
  84.     <bean id="customJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">  
  85.         <property name="name" value="customJob_name"></property>  
  86.         <property name="group" value="customJob_group"></property>  
  87.         <property name="jobClass" value="com.taiyang.quartz.CustomQuartzJob"></property>  
  88.         <property name="requestsRecovery" value="true"/>  
  89.         <property name="durability" value="true"/>  
  90.     </bean>  
  91.     <!-- end customJob -->  
  92.       
  93.     <!--quartz定时任务管理类 -->  
  94.     <bean id="quartzManager" class="com.taiyang.quartz.QuartzManager" init-method="init" />  
  95.       
  96. </beans>  
注意:datasource配置时<property name="defaultAutoCommit" value="true" />打开默认提交事务

4.分布式集群
tomcat1 
tomcat2

都启动时,tomcat1和tomcat2轮流执行
tomcat1停掉后,tomcat2自己执行
重启tomcat1后,tomcat1和tomcat2轮流执行


0. quartz持久化--mysql表   数据库表的建立
-- ----------------------------
--  Table structure for `cache_qrtz_blob_triggers`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_blob_triggers`;
CREATE TABLE `cache_qrtz_blob_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT '调度名',
  `TRIGGER_NAME` varchar(200) NOT NULL COMMENT '触发器名',
  `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT '触发器组名',
  `BLOB_DATA` blob COMMENT 'data',
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
  KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型';

-- ----------------------------
--  Table structure for `cache_qrtz_calendars`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_calendars`;
CREATE TABLE `cache_qrtz_calendars` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT 'scheduler名称',
  `CALENDAR_NAME` varchar(200) NOT NULL COMMENT 'calendar名称',
  `CALENDAR` blob NOT NULL COMMENT 'calendar信息',
  PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='以 Blob 类型存储 Quartz 的 Calendar 信息';

-- ----------------------------
--  Table structure for `cache_qrtz_cron_triggers`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_cron_triggers`;
CREATE TABLE `cache_qrtz_cron_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT 'scheduler名称',
  `TRIGGER_NAME` varchar(200) NOT NULL COMMENT 'trigger名',
  `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT 'trigger组',
  `CRON_EXPRESSION` varchar(120) NOT NULL COMMENT 'cron表达式',
  `TIME_ZONE_ID` varchar(80) DEFAULT NULL COMMENT '时区',
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储 Cron Trigger,包括 Cron 表达式和时区信息';

-- ----------------------------
--  Table structure for `cache_qrtz_fired_triggers`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_fired_triggers`;
CREATE TABLE `cache_qrtz_fired_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT '调度名',
  `ENTRY_ID` varchar(95) NOT NULL COMMENT '条目id',
  `TRIGGER_NAME` varchar(200) NOT NULL COMMENT '出触发器名',
  `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT '触发器组名',
  `INSTANCE_NAME` varchar(200) NOT NULL COMMENT '实例名',
  `FIRED_TIME` bigint(13) NOT NULL COMMENT '执行时间',
  `SCHED_TIME` bigint(13) NOT NULL COMMENT '调度时间',
  `PRIORITY` int(11) NOT NULL COMMENT '优先级',
  `STATE` varchar(16) NOT NULL COMMENT '状态',
  `JOB_NAME` varchar(200) DEFAULT NULL COMMENT 'job名',
  `JOB_GROUP` varchar(200) DEFAULT NULL COMMENT 'job组',
  `IS_NONCONCURRENT` varchar(1) DEFAULT NULL COMMENT '是否非并行执行',
  `REQUESTS_RECOVERY` varchar(1) DEFAULT NULL COMMENT '是否持久化',
  PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`),
  KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`),
  KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`),
  KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
  KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`),
  KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
  KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储已触发的 Trigger相关的状态信息,以及关联 Job 的执行信息';

-- ----------------------------
--  Table structure for `cache_qrtz_job_details`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_job_details`;
CREATE TABLE `cache_qrtz_job_details` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT '调度名',
  `JOB_NAME` varchar(200) NOT NULL COMMENT 'job名',
  `JOB_GROUP` varchar(200) NOT NULL COMMENT 'job组名',
  `DESCRIPTION` varchar(250) DEFAULT NULL COMMENT '描述',
  `JOB_CLASS_NAME` varchar(250) NOT NULL COMMENT 'job类名',
  `IS_DURABLE` varchar(1) NOT NULL COMMENT '是否持久化,0不持久化,1持久化',
  `IS_NONCONCURRENT` varchar(1) NOT NULL COMMENT '是否非并发,0非并发,1并发',
  `IS_UPDATE_DATA` varchar(1) NOT NULL COMMENT '是否更新数据',
  `REQUESTS_RECOVERY` varchar(1) NOT NULL COMMENT '是否可恢复,0不恢复,1恢复',
  `JOB_DATA` blob COMMENT 'job数据',
  PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
  KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`),
  KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储每一个已配置的 Job 的详细信息';

-- ----------------------------
--  Table structure for `cache_qrtz_locks`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_locks`;
CREATE TABLE `cache_qrtz_locks` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT '调度名',
  `LOCK_NAME` varchar(40) NOT NULL COMMENT '锁名',
  PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储程序的悲观锁的信息(假如使用了悲观锁)';

-- ----------------------------
--  Table structure for `cache_qrtz_paused_trigger_grps`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_paused_trigger_grps`;
CREATE TABLE `cache_qrtz_paused_trigger_grps` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT '调度名',
  `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT '触发器组',
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储已暂停的 Trigger 组的信息';

-- ----------------------------
--  Table structure for `cache_qrtz_scheduler_state`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_scheduler_state`;
CREATE TABLE `cache_qrtz_scheduler_state` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT '调度名',
  `INSTANCE_NAME` varchar(200) NOT NULL COMMENT '执行quartz实例的主机名',
  `LAST_CHECKIN_TIME` bigint(13) NOT NULL COMMENT '实例将状态报告给集群中的其它实例的上一次时间',
  `CHECKIN_INTERVAL` bigint(13) NOT NULL COMMENT '实例间状态报告的时间频率',
  PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储少量的有关 Scheduler 的状态信息';

-- ----------------------------
--  Table structure for `cache_qrtz_simple_triggers`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_simple_triggers`;
CREATE TABLE `cache_qrtz_simple_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT '调度名',
  `TRIGGER_NAME` varchar(200) NOT NULL COMMENT '触发器名',
  `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT '触发器组',
  `REPEAT_COUNT` bigint(7) NOT NULL COMMENT '重复次数',
  `REPEAT_INTERVAL` bigint(12) NOT NULL COMMENT '重复间隔',
  `TIMES_TRIGGERED` bigint(10) NOT NULL COMMENT '已触发次数',
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储简单的 Trigger,包括重复次数,间隔,以及已触的次数';

-- ----------------------------
--  Table structure for `cache_qrtz_simprop_triggers`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_simprop_triggers`;
CREATE TABLE `cache_qrtz_simprop_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT '调度名',
  `TRIGGER_NAME` varchar(200) NOT NULL COMMENT '触发器名',
  `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT '触发器组',
  `STR_PROP_1` varchar(512) DEFAULT NULL COMMENT 'str参数1',
  `STR_PROP_2` varchar(512) DEFAULT NULL COMMENT 'str参数2',
  `STR_PROP_3` varchar(512) DEFAULT NULL COMMENT 'str参数3',
  `INT_PROP_1` int(11) DEFAULT NULL COMMENT 'int参数1',
  `INT_PROP_2` int(11) DEFAULT NULL COMMENT 'int参数2',
  `LONG_PROP_1` bigint(20) DEFAULT NULL COMMENT 'long参数1',
  `LONG_PROP_2` bigint(20) DEFAULT NULL COMMENT 'long参数2',
  `DEC_PROP_1` decimal(13,4) DEFAULT NULL COMMENT 'decimal参数1',
  `DEC_PROP_2` decimal(13,4) DEFAULT NULL COMMENT 'decimal参数2',
  `BOOL_PROP_1` varchar(1) DEFAULT NULL COMMENT 'bool参数1',
  `BOOL_PROP_2` varchar(1) DEFAULT NULL COMMENT 'bool参数2',
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
--  Table structure for `cache_qrtz_triggers`
-- ----------------------------
DROP TABLE IF EXISTS `cache_qrtz_triggers`;
CREATE TABLE `cache_qrtz_triggers` (
  `SCHED_NAME` varchar(120) NOT NULL COMMENT '调度名',
  `TRIGGER_NAME` varchar(200) NOT NULL COMMENT '触发器名',
  `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT '触发器组',
  `JOB_NAME` varchar(200) NOT NULL COMMENT 'job名',
  `JOB_GROUP` varchar(200) NOT NULL COMMENT 'job组',
  `DESCRIPTION` varchar(250) DEFAULT NULL COMMENT '描述',
  `NEXT_FIRE_TIME` bigint(13) DEFAULT NULL COMMENT '下次执行时间',
  `PREV_FIRE_TIME` bigint(13) DEFAULT NULL COMMENT '上次执行时间',
  `PRIORITY` int(11) DEFAULT NULL COMMENT '优先级',
  `TRIGGER_STATE` varchar(16) NOT NULL COMMENT '触发器状态',
  `TRIGGER_TYPE` varchar(8) NOT NULL COMMENT '触发器类型',
  `START_TIME` bigint(13) NOT NULL COMMENT '开始时间',
  `END_TIME` bigint(13) DEFAULT NULL COMMENT '结束时间',
  `CALENDAR_NAME` varchar(200) DEFAULT NULL COMMENT 'calendar名',
  `MISFIRE_INSTR` smallint(2) DEFAULT NULL COMMENT 'misfire',
  `JOB_DATA` blob COMMENT 'job数据',
  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
  KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
  KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`),
  KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`),
  KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`),
  KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`),
  KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
  KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
  KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`),
  KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`),
  KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`),
  KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`),
  KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储已配置的 Trigger 的信息';





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值