第一章、Quartz
1.1 Quartz概念
Quartz是OpenSymphony開源組織的一個(gè)Java開源項(xiàng)目,在2009被Terracotta收購(gòu)。Quartz官網(wǎng)
1.2 Quartz任務(wù)調(diào)度主要元素
Quartz任務(wù)調(diào)度的主要元素有:
Trigger(觸發(fā)器)
Scheduler(任務(wù)調(diào)度器)
Job(任務(wù))
其中Trigger,Job是元數(shù)據(jù),Scheduler才是任務(wù)調(diào)度的控制器。
1.3 Quartz特點(diǎn)
強(qiáng)大的調(diào)度功能,例如支持多樣的調(diào)度方式
靈活的應(yīng)用方式,例如支持任務(wù)和調(diào)度的多種組合方式
分布式和集群功能,在被Terracotta收購(gòu)后,在Quartz的基礎(chǔ)上的拓展
1.4 Quartz基本元素關(guān)系圖
第二章、Trigger(觸發(fā)器)
2.1 Trigger定義
Trigger也即觸發(fā)器,用于定義任務(wù)調(diào)度時(shí)間規(guī)則
2.2 Trigger屬性
startTime和endTime
所有的Trigger都包含startTime、endTime這兩個(gè)屬性
優(yōu)先級(jí)(Priority)
觸發(fā)器的優(yōu)先級(jí)值默認(rèn)為5,不過注意優(yōu)先級(jí)是針對(duì)同一時(shí)刻來說的,在同一時(shí)刻優(yōu)先級(jí)高的先觸發(fā)。假如一個(gè)觸發(fā)器被執(zhí)行時(shí)間為3:00,另外一個(gè)為3:01,那么肯定是先執(zhí)行時(shí)間為3:00的觸發(fā)器。
錯(cuò)失觸發(fā)(Misfire)策略
在任務(wù)調(diào)度中,并不能保證所有的觸發(fā)器都會(huì)在指定時(shí)間被觸發(fā),假如Scheduler資源不足或者服務(wù)器重啟的情況,就好發(fā)生錯(cuò)失觸發(fā)的情況。
2.3 Trigger類型
在任務(wù)調(diào)度Quartz中,Trigger主要的觸發(fā)器有:SimpleTrigger,CalendarIntervelTrigger,DailyTimeIntervalTrigger,CronTrigger,注意,本博客所介紹的觸發(fā)器都是基于Quartz2.2.x版本的,不同版本,觸發(fā)器類型略有不同。
2.3.1 SimpleTrigger
SimpleTrigger是一種最基本的觸發(fā)器,指定從某一個(gè)時(shí)間開始,以一定的時(shí)間間隔執(zhí)行的任務(wù)。
SimpleTrigger的屬性有:
repeatInterval重復(fù)間隔
repeatCount重復(fù)次數(shù),實(shí)際執(zhí)行次數(shù)是repeatCount+1。
simpleSchedule()
//.withIntervalInHours(1)//每小時(shí)執(zhí)行一次
.withIntervalInMinutes(1)//每分鐘執(zhí)行一次
//.repeatForever()//次數(shù)不限
.withRepeatCount(10)//次數(shù)為10次
.build();
//構(gòu)建
2.3.2 CalendarIntervalTrigger
CalendarIntervalTrigger和SimpleTrigger不同的是,SimpleTrigger指定的時(shí)間間隔為毫秒,CalendarIntervalTrigger支持的間隔單位有秒,分鐘,小時(shí),天,月,年,星期。
CalendarIntervalTrigger的屬性有:
interval執(zhí)行間隔
intervalUnit執(zhí)行間隔的單位(秒,分鐘,小時(shí),天,月,年,星期)
calendarIntervalSchedule()
.withIntervalInDays(1)//每天執(zhí)行一次
//.withIntervalInWeeks(1)//每周執(zhí)行一次
.build();
2.3.3 DailyTimeIntervalTrigger
DailyTimeIntervalTrigger和SimpleTrigger不同的是不僅可以支持SimpleTrigger支持時(shí)間間隔類型,而且還支持指定星期。
DailyTimeIntervalTrigger的屬性有:
startTimeOfDay每天開始時(shí)間
endTimeOfDay每天結(jié)束時(shí)間
daysOfWeek需要執(zhí)行的星期
interval執(zhí)行間隔
intervalUnit執(zhí)行間隔的單位(秒,分鐘,小時(shí),天,月,年,星期)
repeatCount重復(fù)次數(shù)
dailyTimeIntervalSchedule()
.startingDailyAt(TimeOfDay.hourAndMinuteOfDay(9,0))
//第天9:00開始
.endingDailyAt(TimeOfDay.hourAndMinuteOfDay(15,0))
//15:00結(jié)束
.onDaysOfTheWeek(MONDAY,TUESDAY,WEDNESDAY
,THURSDAY,FRIDAY)
//周一至周五執(zhí)行
.withIntervalInHours(1)
//每間隔1小時(shí)執(zhí)行一次
.withRepeatCount(100)
//最多重復(fù)100次(實(shí)際執(zhí)行100+1次)
.build();
2.3.4 CronTrigge
CronTrigger適合于更復(fù)雜的任務(wù),它支持Linux Cron的語法。CronTrigger覆蓋了以上三種Trigger的大部分功能。
CronTrigger的屬性只有;
Cron表達(dá)式,Cron表達(dá)式需要程序員自己編寫,比較復(fù)雜
cronSchedule("0 0/3 9-15**?")//每天9:00-15:00,每隔3分鐘執(zhí)行一次
.build();
cronSchedule("0 30 9?*MON")//每周一,9:30執(zhí)行一次
.build();
weeklyonDayAndHourAndMinute(MONDAY,9,30)//等同于0 30 9?*MON
.build();
Cron表達(dá)式
星號(hào)():可用在所有字段中,表示對(duì)應(yīng)時(shí)間域的每一個(gè)時(shí)刻,例如,在分鐘字段時(shí),表示“每分鐘”;
問號(hào)(?):該字符只在日期和星期字段中使用,它通常指定為“無意義的值”,相當(dāng)于點(diǎn)位符;
減號(hào)(-):表達(dá)一個(gè)范圍,如在小時(shí)字段中使用“10-12”,則表示從10到12點(diǎn),即10,11,12;
逗號(hào)(,):表達(dá)一個(gè)列表值,如在星期字段中使用“MON,WED,FRI”,則表示星期一,星期三和星期五;
斜杠(/):x/y表達(dá)一個(gè)等步長(zhǎng)序列,x為起始值,y為增量步長(zhǎng)值。如在分鐘字段中使用0/15,則表示為0,15,30和45秒,而5/15在分鐘字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;
L:該字符只在日期和星期字段中使用,代表“Last”的意思,但它在兩個(gè)字段中意思不同。L在日期字段中,表示這個(gè)月份的最后一天,如一月的31號(hào),非閏年二月的28號(hào);如果L用在星期中,則表示星期六,等同于7。但是,如果L出現(xiàn)在星期字段里,而且在前面有一個(gè)數(shù)值X,則表示“這個(gè)月的最后X天”,例如,6L表示該月的最后星期五;
W:該字符只能出現(xiàn)在日期字段里,是對(duì)前導(dǎo)日期的修飾,表示離該日期最近的工作日。例如15W表示離該月15號(hào)最近的工作日,如果該月15號(hào)是星期六,則匹配14號(hào)星期五;如果15日是星期日,則匹配16號(hào)星期一;如果15號(hào)是星期二,那結(jié)果就是15號(hào)星期二。但必須注意關(guān)聯(lián)的匹配日期不能夠跨月,如你指定1W,如果1號(hào)是星期六,結(jié)果匹配的是3號(hào)星期一,而非上個(gè)月最后的那天。W字符串只能指定單一日期,而不能指定日期范圍;
LW組合:在日期字段可以組合使用LW,它的意思是當(dāng)月的最后一個(gè)工作日;
井號(hào)(#):該字符只能在星期字段中使用,表示當(dāng)月某個(gè)工作日。如6#3表示當(dāng)月的第三個(gè)星期五(6表示星期五,#3表示當(dāng)前的第三個(gè)),而4#5表示當(dāng)月的第五個(gè)星期三,假設(shè)當(dāng)月沒有第五個(gè)星期三,忽略不觸發(fā);
C:該字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是計(jì)劃所關(guān)聯(lián)的日期,如果日期沒有被關(guān)聯(lián),則相當(dāng)于日歷中所有日期。例如5C在日期字段中就相當(dāng)于日歷5日以后的第一天。1C在星期字段中相當(dāng)于星期日后的第一天。
Cron表達(dá)式對(duì)特殊字符的大小寫不敏感,對(duì)代表星期的縮寫英文大小寫也不敏感。
以上就是長(zhǎng)沙達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java基礎(chǔ)學(xué)習(xí),quartz框架視頻教程”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。