Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是彻底由java开发的一个开源的任务日程管理系统,“任务进度管理器”就是一个在预先肯定(被归入日程)的时间到达时,负责执行(或者通知)其余软件组件的系统。
Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了全部Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操做,例如:将任务归入日程或者从日程中取消,开始/中止/暂停日程进度。 java
定时器种类 :Quartz 中五种类型的 Trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,NthIncludedDayTrigger和Calendar 类( org.quartz.Calendar)。mysql
最经常使用种类:
一、SimpleTrigger:用来触发只需执行一次或者在给定时间触发而且重复N次且每次执行延迟必定时间的任务。
二、CronTrigger:按照日历触发,例如“每一个周五”,每月10日中午或者10:15分。 sql
存储方式 :RAMJobStore和JDBCJobStore数据库
类型服务器 |
优势数据结构 |
缺点并发 |
RAMJobStoreide |
不要外部数据库,配置容易,运行速度快源码分析 |
由于调度程序信息是存储在被分配给JVM的内存里面,因此,当应用程序中止运行时,全部调度信息将被丢失。另外由于存储到JVM内存里面,因此能够存储多少个Job和Trigger将会受到限制ui |
JDBCJobStore |
支持集群,由于全部的任务信息都会保存到数据库中,能够控制事物,还有就是若是应用服务器关闭或者重启,任务信息都不会丢失,而且能够恢复因服务器关闭或者重启而致使执行失败的任务 |
运行速度的快慢取决与链接数据库的快慢 |
表结构关系:
数据结构文档说明 :
表名称 |
说明 |
qrtz_blob_triggers |
Trigger做为Blob类型存储(用于Quartz用户用JDBC建立他们本身定制的Trigger类型,JobStore 并不知道如何存储实例的时候) |
qrtz_calendars |
以Blob类型存储Quartz的Calendar日历信息, quartz可配置一个日从来指定一个时间范围 |
qrtz_cron_triggers |
存储Cron Trigger,包括Cron表达式和时区信息。 |
qrtz_fired_triggers |
存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息 |
qrtz_job_details |
存储每个已配置的Job的详细信息 |
qrtz_locks |
存储程序的非观锁的信息(假如使用了悲观锁) |
qrtz_paused_trigger_graps |
存储已暂停的Trigger组的信息 |
qrtz_scheduler_state |
存储少许的有关 Scheduler的状态信息,和别的 Scheduler 实例(假如是用于一个集群中) |
qrtz_simple_triggers |
存储简单的 Trigger,包括重复次数,间隔,以及已触的次数 |
qrtz_triggers |
存储已配置的 Trigger的信息 |
qrzt_simprop_triggers |
|
mysql表执行SQL:
-- in your Quartz properties file, you'll need to set org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate -- 你须要在你的quartz.properties文件中设置org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate -- StdJDBCDelegate说明支持集群,全部的任务信息都会保存到数据库中,能够控制事物,还有就是若是应用服务器关闭或者重启,任务信息都不会丢失,而且能够恢复因服务器关闭或者重启而致使执行失败的任务 -- This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM -- 这是来自quartz的脚本,在MySQL数据库中建立如下的表,修改成使用INNODB而不是MYISAM -- 你须要在数据库中执行如下的sql脚本 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; -- 存储每个已配置的Job的详细信息 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的信息 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; -- 存储已配置的Simple Trigger的信息 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 Trigger,包括Cron表达式和时区信息 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(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(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; -- Trigger做为Blob类型存储(用于Quartz用户用JDBC建立他们本身定制的Trigger类型,JobStore并不知道如何存储实例的时候) 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), 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; -- 以Blob类型存储Quartz的Calendar日历信息,quartz可配置一个日从来指定一个时间范围 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; -- 存储已暂停的Trigger组的信息 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; -- 存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息 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 实例(假如是用于一个集群中) 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; -- 存储程序的非观锁的信息(假如使用了悲观锁) 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;
核心类说明:
类名称 |
说明 |
QuartzSchedulerThread |
负责执行向QuartzScheduler注册的触发Trigger的工做的线程。 |
ThreadPool |
Scheduler使用一个线程池做为任务运行的基础设施,任务经过共享线程池中的线程提供运行效率。 |
QuartzSchedulerResources |
包含建立QuartzScheduler实例所需的全部资源(JobStore,ThreadPool等)。 |
SchedulerFactory |
提供用于获取调度程序实例的客户端可用句柄的机制。 |
JobStore |
经过类实现的接口,这些类要为org.quartz.core.QuartzScheduler的使用提供一个org.quartz.Job和org.quartz.Trigger存储机制。 做业和触发器的存储应该以其名称和组的组合为惟一性。 |
QuartzScheduler |
这是Quartz的核心,它是org.quartz.Scheduler接口的间接实现,包含调度org.quartz.Jobs,注册org.quartz.JobListener实例等的方法。 |
Trigger |
具备全部触发器通用属性的基本接口,描述了job执行的时间出发规则。 - 使用TriggerBuilder实例化实际触发器。 |
JobDetail |
传递给定做业实例的详细信息属性。 JobDetails将使用JobBuilder建立/定义。 |
Job |
要由表示要执行的“做业”的类实现的接口。只有一个方法 void execute(jobExecutionContext context) |
备注:一个job能够被多个Trigger 绑定,可是一个Trigger只能绑定一个job!
配置文件属性说明:
quartz.properties //调度标识名 集群中每个实例都必须使用相同的名称 (区分特定的调度器实例) 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:123456 org.quartz.dataSource.qzDS.maxConnection:10
JDBC插入表顺序:
主要的JDBC操做类,执行sql顺序。
Simple_trigger :插入顺序
qrtz_job_details —> qrtz_triggers —> qrtz_simple_triggers
qrtz_fired_triggers
Cron_Trigger:插入顺序
qrtz_job_details —> qrtz_triggers —> qrtz_cron_triggers
qrtz_fired_triggers
SimpleTrigger的MisFire策略有:
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
这个不是忽略已经错失的触发的意思,而是说忽略MisFire策略。它会在资源合适的时候,从新触发全部的MisFire任务,而且不会影响现有的调度时间。
好比,SimpleTrigger每15秒执行一次,而中间有5分钟时间它都MisFire了,一共错失了20个,5分钟后,假设资源充足了,而且任务容许并发,它会被一次性触发。
这个属性是全部Trigger都适用。
MISFIRE_INSTRUCTION_FIRE_NOW
忽略已经MisFire的任务,而且当即执行调度。这一般只适用于只执行一次的任务。
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT
将startTime设置当前时间,当即从新调度任务,包括的MisFire的
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
相似MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT,区别在于会忽略已经MisFire的任务
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT
在下一次调度时间点,从新开始调度任务,包括的MisFire的
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
相似于MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT,区别在于会忽略已经MisFire的任务。
MISFIRE_INSTRUCTION_SMART_POLICY
全部的Trigger的MisFire默认值都是这个,大体意思是“把处理逻辑交给聪明的Quartz去决定”。基本策略是,
CronTrigger的熄火策略
Cron表达式案例
位置 | 时间域 | 容许值 | 特殊值 |
---|---|---|---|
1 | 秒 | 0-59 | , - * / |
2 | 分钟 | 0-59 | , - * / |
3 | 小时 | 0-23 | , - * / |
4 | 日期 | 1-31 | , - * ? / L W C |
5 | 月份 | 1-12 | , - * / |
6 | 星期 | 1-7 | , - * ? / L C # |
7 | 年份(可选) | 1-31 | , - * / |
星号(*):可用在全部字段中,表示对应时间域的每个时刻,例如, 在分钟字段时,表示“每分钟”;
问号(?):该字符只在日期和星期字段中使用,它一般指定为“无心义的值”,至关于点位符;
减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;
逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;
斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可使用*/y,它等同于0/y;
L:该字符只在日期和星期字段中使用,表明“Last”的意思,但它在两个字段中意思不一样。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;若是L用在星期中,则表示星期六,等同于7。可是,若是L出如今星期字段里,并且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;
W:该字符只能出如今日期字段里,是对前导日期的修饰,表示离该日期最近的工做日。例如15W表示离该月15号最近的工做日,若是该月15号是星期六,则匹配14号星期五;若是15日是星期日,则匹配16号星期一;若是15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不可以跨月,如你指定1W,若是1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围;
LW组合:在日期字段能够组合使用LW,它的意思是当月的最后一个工做日;
井号(#):该字符只能在星期字段中使用,表示当月某个工做日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;
C:该字符只在日期和星期字段中使用,表明“Calendar”的意思。它的意思是计划所关联的日期,若是日期没有被关联,则至关于日历中全部日期。例如5C在日期字段中就至关于日历5日之后的第一天。1C在星期字段中至关于星期往后的第一天。
Cron表达式对特殊字符的大小写不敏感,对表明星期的缩写英文大小写也不敏感。
表示式 | 说明 |
---|---|
0 0 12 * * ? | 天天12点运行 |
0 15 10 ? * * | 天天10:15运行 |
0 15 10 * * ? | 天天10:15运行 |
0 15 10 * * ? * | 天天10:15运行 |
0 15 10 * * ? 2008 | 在2008年的天天10:15运行 |
0 * 14 * * ? | 天天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。 |
0 0/5 14 * * ? | 天天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。 |
0 0/5 14,18 * * ? | 天天14点到15点每5分钟运行一次,此外天天18点到19点每5钟也运行一次。 |
0 0-5 14 * * ? | 天天14:00点到14:05,每分钟运行一次。 |
0 10,44 14 ? 3 WED | 3月每周三的14:10分到14:44,每分钟运行一次。 |
0 15 10 ? * MON-FRI | 每周一,二,三,四,五的10:15分运行。 |
0 15 10 15 * ? | 每个月15日10:15分运行。 |
0 15 10 L * ? | 每个月最后一天10:15分运行。 |
0 15 10 ? * 6L | 每个月最后一个星期五10:15分运行。 |
0 15 10 ? * 6L 2007-2009 | 在2007,2008,2009年每月的最后一个星期五的10:15分运行。 |
0 15 10 ? * 6#3 | 每个月第三个星期五的10:15分运行。 |
参考文章
官网: http://www.quartz-scheduler.org/
深刻解读Quartz的原理 :http://lavasoft.blog.51cto.com/62575/181907/
基于 Quartz 开发企业级任务调度应用 :http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/
quartz 数据库表含义解释 :http://blog.csdn.net/tengdazhang770960436/article/details/51019291
Quartz源码分析: https://my.oschina.net/chengxiaoyuan/blog/664833
http://blog.csdn.net/u010648555/article/category/6601767
Quartz系列:http://blog.csdn.net/Evankaka/article/category/3155529