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