quartz 定時任務(—)

1、簡介

  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;
View Code

核心類說明:

類名稱

說明

QuartzSchedulerThread 

負責執行向QuartzScheduler註冊的觸發Trigger的工做的線程。 

ThreadPool

Scheduler使用一個線程池做爲任務運行的基礎設施,任務經過共享線程池中的線程提供運行效率。

QuartzSchedulerResources

包含建立QuartzScheduler實例所需的全部資源(JobStore,ThreadPool等)。 

SchedulerFactory 

提供用於獲取調度程序實例的客戶端可用句柄的機制。

JobStore

經過類實現的接口,這些類要爲org.quartz.core.QuartzScheduler的使用提供一個org.quartz.Joborg.quartz.Trigger存儲機制。

做業和觸發器的存儲應該以其名稱和組的組合爲惟一性。 

QuartzScheduler 

這是Quartz的核心,它是org.quartz.Scheduler接口的間接實現,包含調度org.quartz.Jobs,註冊org.quartz.JobListener實例等的方法。 
Scheduler 
:這是Quartz Scheduler的主要接口,表明一個獨立運行容器。調度程序維護JobDetails和觸發器的註冊表。一旦註冊,調度程序負責執行做業,當他們的相關聯的觸發器觸發(當他們的預約時間到達時)。

Trigger 

具備全部觸發器通用屬性的基本接口,描述了job執行的時間出發規則。 - 使用TriggerBuilder實例化實際觸發器。 

JobDetail 

傳遞給定做業實例的詳細信息屬性。 JobDetails將使用JobBuilder建立/定義。

Job

要由表示要執行的做業的類實現的接口。只有一個方法 void execute(jobExecutionContext context) 
(jobExecutionContext
提供調度上下文各類信息,運行時數據保存在jobDataMap
Job
有個子接口StatefulJob ,表明有狀態任務。 
有狀態任務不可併發,前次任務沒有執行完,後面任務處於阻塞等到。

備註:一個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去決定」。基本策略是,

    1. 若是是隻執行一次的調度,使用MISFIRE_INSTRUCTION_FIRE_NOW
    2. 若是是無限次的調度(repeatCount是無限的),使用MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
    3. 不然,使用MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT

CronTrigger的熄火策略

  • MISFIRE_INSTRUCTION_FIRE_ONCE_NOW - 若是熄火,該指令會告訴Quartz但願立刻再次觸發
  • MISFIRE_INSTRUCTION_DO_NOTHING - 若是熄火,該指令會告訴Quartz下一次執行時間到來時再執行,並不想立刻執行

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

相關文章
相關標籤/搜索