




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Quartz2.2版本開發(fā)手冊Java版2014年5月13日星期二What is Quartz?Job Scheduling LibraryQuartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to creat
2、e simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JT
3、A transactions and clustering.Quartz is freely usable, licensed under the Apache 2.0 license.什么是Quartz? 作業(yè)調(diào)度圖書館 Quartz是一個功能豐富的,開源的作業(yè)調(diào)度庫,可以在幾乎任何Java應(yīng)用程序集成 - 從最小的獨(dú)立的應(yīng)用程序,以最大的電子商務(wù)系統(tǒng)。 Quartz可以用來創(chuàng)建簡單或復(fù)雜的調(diào)度執(zhí)行幾十,幾百,甚至是數(shù)萬名成千上萬的就業(yè)機(jī)會; job被定義為標(biāo)準(zhǔn)的Java組件可以執(zhí)行幾乎任何你可以編程他們做。 Quartz調(diào)度包括了許多企業(yè)級特性,如JTA事務(wù)和集群支持。 Quartz是可自
4、由使用的,基于Apache2.0許可協(xié)議發(fā)布。目錄1.1 Quartz手冊java版-(一)使用Quartz11.2 Quartz手冊java版-(二)Jobs And Triggers21.3 Quartz手冊java版-(三)更多關(guān)于Jobs和JobDetails41.4 Quartz手冊java版-(四)關(guān)于Triggers更多內(nèi)容81.5 Quartz手冊java版-(五) SimpleTrigger111.6 Quartz手冊java版-(六)CronTrigger131.7 Quartz手冊java版-(七)TriggerListeners和JobListeners151.8 Qu
5、artz手冊java版-(八)SchedulerListeners171.9 Quartz手冊java版-(九)JobStores181.10 Quartz手冊java版-(十)配置、資源使用以及SchedulerFactory211.11 Quartz手冊java版-(十一)高級(企業(yè)級)屬性231.12 Quartz手冊java版-(十二)Quartz 的其他特性241.1 Quartz手冊java版-(一)使用Quartz使用scheduler之前應(yīng)首先實(shí)例化它。使用SchedulerFactory可以完成scheduler的實(shí)例化。用戶可直接地實(shí)例化這個工廠類并且直接使用工廠的實(shí)例(例
6、如下面的例子)。 一旦一個scheduler被實(shí)例化,它就可以被啟動(start),并且處于駐留模式,直到被關(guān)閉(shutdown)。注意,一旦scheduler被關(guān)閉(shutdown),則它不能再重新啟動,除非重新實(shí)例化它。除非scheduler 被啟動或者不處于暫停狀態(tài),否則觸發(fā)器不會被觸發(fā)(任務(wù)也不能被執(zhí)行)。 下面是一個代碼片斷,這個代碼片斷實(shí)例化并且啟動了一個scheduler,接著將一個要執(zhí)行的任務(wù)納入了進(jìn)程。SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();Scheduler sched
7、 = schedFact.getScheduler();sched.start();JobDetail jobDetail = new JobDetail(myJob, null, DumbJob.class);Trigger trigger = TriggerUtils.makeHourlyTrigger(); / fire every hourtrigger.setStartTime(TriggerUtils.getEvenHourDate(new Date(); / start on the next even hourtrigger.setName(myTrigger);sched.s
8、cheduleJob(jobDetail, trigger);如您所見,使用quartz相當(dāng)簡單,在第二課中,我們將給出一個Job和Trigger的快速預(yù)覽,這樣就能夠充分理解這個例子。1.2 Quartz手冊java版-(二)Jobs And Triggers正如前面所提到的那樣,通過實(shí)現(xiàn)Job接口來使你的.NET組件可以很簡單地被scheduler執(zhí)行。下面是Job接口:package org.quartz;public interface Job public void execute(JobExecutionContext context) throws JobExecutionExc
9、eption;這樣,你會猜想出,當(dāng)Job觸發(fā)器觸發(fā)時(在某個時刻),Execute (.)就被scheduler所調(diào)用。JobExecutionContext對象被傳遞給這個方法,它為Job實(shí)例提供了它的“運(yùn)行時”環(huán)境-一個指向執(zhí)行這個IJob實(shí)例的Scheduler句柄,一個指向觸發(fā)該次執(zhí)行的觸發(fā)器的句柄,IJob的JobDetail對象以及一些其他的條目。JobDetail對象由Quartz客戶端在Job被加入到scheduler時創(chuàng)建。它包含了Job的各種設(shè)置屬性以及一個JobDataMap對象,這個對象被用來存儲給定Job類實(shí)例的狀態(tài)信息。Trigger對象被用來觸發(fā)jobs的執(zhí)行。你
10、希望將任務(wù)納入到進(jìn)度,要實(shí)例化一個Trigger并且“調(diào)整”它的屬性以滿足你想要的進(jìn)度安排。Triggers也有一個JobDataMap與之關(guān)聯(lián),這非常有利于向觸發(fā)器所觸發(fā)的Job傳遞參數(shù)。Quartz打包了很多不同類型的Trigger,但最常用的Trigge類是SimpleTrigger和CronTrigger。SimpleTrigger用來觸發(fā)只需執(zhí)行一次或者在給定時間觸發(fā)并且重復(fù)N次且每次執(zhí)行延遲一定時間的任務(wù)。CronTrigger按照日歷觸發(fā),例如“每個周五”,每個月10日中午或者10:15分。 為什么要分為Jobs和Triggers?很多任務(wù)日程管理器沒有將Jobs和Trigger
11、s進(jìn)行區(qū)分。一些產(chǎn)品中只是將“job”簡單地定義為一個帶有一些小任務(wù)標(biāo)識的執(zhí)行時間。其他產(chǎn)品則更像Quartz中job和trigger的聯(lián)合。而開發(fā)Quartz的時候,我們決定對日程和按照日程執(zhí)行的工作進(jìn)行分離。(從我們的觀點(diǎn)來看)這有很多好處。 例如:jobs可以被創(chuàng)建并且存儲在job scheduler中,而不依賴于trigger,而且,很多triggers可以關(guān)聯(lián)一個job.另外的好處就是這種“松耦合”能使與日程中的Job相關(guān)的trigger過期后重新配置這些Job,這樣以后就能夠重新將這些Job納入日程而不必重新定義它們。這樣就可以更改或者替換trigger而不必重新定義與之相連的jo
12、b標(biāo)識符。當(dāng)向Quartz scheduler中注冊Jobs 和Triggers時,它們要給出標(biāo)識它們的名字。Jobs 和Triggers也可以被放入“組”中?!敖M”對于后續(xù)維護(hù)過程中,分類管理Jobs和Triggers非常有用。Jobs和Triggers的名字在組中必須唯一,換句話說,Jobs和Triggers真實(shí)名字是它的名字+組。如果使Job或者Trigger的組為null,這等價于將其放入缺省的Scheduler.DEFAULT_GROUP組中。1.3 Quartz手冊java版-(三)更多關(guān)于Jobs和JobDetails如你所見,Job相當(dāng)容易實(shí)現(xiàn)。這里只是介紹有關(guān)Jobs本質(zhì),
13、Job接口的Execute(.)方法以及JobDetails中需要理解的內(nèi)容。在所實(shí)現(xiàn)的類成為真正的“Job”時,期望任務(wù)所具有的各種屬性需要通知給Quartz。通過JobDetail類可以完成這個工作,這個類在前面的章節(jié)中曾簡短提及過?,F(xiàn)在,我們花一些時間來討論Quartz中Jobs的本質(zhì)和Job實(shí)例的生命周期。首先讓我們回顧一下第一課中所看到的代碼片斷JobDetail jobDetail = new JobDetail(myJob, / job name sched.DEFAULT_GROUP, / job group (you can also specify null to use
14、the default group) DumbJob.class); / the java class to executeTrigger trigger = TriggerUtils.makeDailyTrigger(8, 30);trigger.setStartTime(new Date();trigger.setName(myTrigger);sched.scheduleJob(jobDetail, trigger);現(xiàn)在定義一個DumbJob類public class DumbJob implements Job public DumbJob() public void execute
15、(JobExecutionContext context) throws JobExecutionException System.err.println(DumbJob is executing.); 注意我們傳遞給scheduler一個JobDetail實(shí)例,JobDetail關(guān)聯(lián)一個job,提供job的class,每次scheduler執(zhí)行job時,在執(zhí)行execute(.)這前會創(chuàng)建一個實(shí)例.job必須有一個無參構(gòu)造方法.你可能想問如何提供配置 job實(shí)例.或者保存job狀態(tài)在執(zhí)行過程中.答案是JobDataMap.它是JobDetail的一部分.JobDataMap JobDataM
16、ap被用來保存一系列的(序列化的)對象,這些對象在Job執(zhí)行時可以得到。JobDataMap是Map接口的一個實(shí)現(xiàn),而且還增加了一些存儲和讀取主類型數(shù)據(jù)的便捷方法。jobDetail.getJobDataMap().put(jobSays, Hello World!);jobDetail.getJobDataMap().put(myFloatValue, 3.141f);jobDetail.getJobDataMap().put(myStateData, new ArrayList();下面的代碼展示了在Job執(zhí)行過程中從JobDataMap 獲取數(shù)據(jù)的代碼public class DumbJ
17、ob implements Job public DumbJob() public void execute(JobExecutionContext context) throws JobExecutionException String instName = context.getJobDetail().getName(); String instGroup = context.getJobDetail().getGroup(); JobDataMap dataMap = context.getJobDetail().getJobDataMap(); String jobSays = dat
18、aMap.getString(jobSays); float myFloatValue = dataMap.getFloat(myFloatValue); ArrayList state = (ArrayList)dataMap.get(myStateData); state.add(new Date(); System.err.println(Instance + instName + of DumbJob says: + jobSays); 如果使用一個持久的JobStore(在本指南的JobStore章節(jié)中討論),那么必須注意存放在JobDataMap中的內(nèi)容。因?yàn)榉湃隞obDataMa
19、p中的內(nèi)容將被序列化,而且容易出現(xiàn)類型轉(zhuǎn)換問題。很明顯,標(biāo)準(zhǔn).NET類型將是非常安全的,但除此之外的類型,任何時候,只要有人改變了你要序列化其實(shí)例的類的定義,就要注意是否打破了程序的兼容性。另外,你可以對JobStore和JobDataMap采用一種使用模式:就是只把主類型和String類型存放在Map中,這樣就可以減少后面序列化的問題。Triggers也可以有JobDataMaps與之相關(guān)聯(lián)。當(dāng)scheduler中的Job被多個有規(guī)律或者重復(fù)觸發(fā)的Triggers所使用時非常有用。對于每次獨(dú)立的觸發(fā),你可為Job提供不同的輸入數(shù)據(jù)。 從Job執(zhí)行時的JobExecutionContext中取
20、得JobDataMap是慣用手段,它融合了從JobDetail和從Trigger中獲的JobDataMap,當(dāng)有相同名字的鍵時,它用后者的值覆蓋前者值。下面給一個例子取數(shù)據(jù)從JobExecutionContext 關(guān)聯(lián)JobDatMap在job執(zhí)行中public class DumbJob implements Job public DumbJob() public void execute(JobExecutionContext context) throws JobExecutionException String instName = context.getJobDetail().get
21、Name(); String instGroup = context.getJobDetail().getGroup(); JobDataMap dataMap = context.getMergedJobDataMap(); / Note the difference from the previous example String jobSays = dataMap.getString(jobSays); float myFloatValue = dataMap.getFloat(myFloatValue); ArrayList state = (ArrayList)dataMap.get
22、(myStateData); state.add(new Date(); System.err.println(Instance + instName + of DumbJob says: + jobSays); StatefulJob有狀態(tài)任務(wù) 現(xiàn)在,一些關(guān)于Job狀態(tài)數(shù)據(jù)的附加論題:一個Job實(shí)例可以被定義為“有狀態(tài)的”或者“無狀態(tài)的”?!盁o狀態(tài)的”任務(wù)只擁有它們被加入到scheduler時所存儲的JobDataMap。這意味著,在執(zhí)行任務(wù)過程中任何對Job Data Map所作的更改都將丟失而且任務(wù)下次執(zhí)行時也無法看到。你可能會猜想出,有狀態(tài)的任務(wù)恰好相反,它在任務(wù)的每次執(zhí)行之后重新存儲
23、JobDataMap。有狀態(tài)任務(wù)的一個副作用就是它不能并發(fā)執(zhí)行。換句話說,如果任務(wù)有狀態(tài),那么當(dāng)觸發(fā)器在這個任務(wù)已經(jīng)在執(zhí)行的時候試圖觸發(fā)它,這個觸發(fā)器就會被阻塞(等待),直到前面的執(zhí)行完成。 想使任務(wù)有狀態(tài),它就要實(shí)現(xiàn)StatefulJob 接口而不是實(shí)現(xiàn)Job接口.Job Instances 任務(wù)“實(shí)例” 這個課程的最終觀點(diǎn)或許已經(jīng)很明確,可以創(chuàng)建一個單獨(dú)的Job類,并且通過創(chuàng)建多個JobDetails實(shí)例來將它的多個實(shí)例存儲在scheduler中,這樣每個JobDetails對象都有它自己的一套屬性和JobDataMap,而且將它們都加入到scheduler中。當(dāng)觸發(fā)器被觸發(fā)的時候,通過S
24、cheduler中配置的JobFactory來實(shí)例化與之關(guān)聯(lián)的Job類。缺省的JobFactory只是簡單地對Job類調(diào)用newInstance()方法。創(chuàng)建自己JobFactory可以利用應(yīng)用中諸如Ioc或者DI容器所產(chǎn)生或者初始化的Job實(shí)例。jobs的其它屬性 這里簡短地總結(jié)一下通過JobDetail對象可以定義Job的其它屬性。 Durability(持久性)-如果一個Job是不持久的, 一旦沒有觸發(fā)器與之關(guān)聯(lián),它就會被從scheduler 中自動刪除。 Volatility(無常性)-如果一個Job是無常的,在重新啟動Quartz i scheduler 時它不能被保持。 Reque
25、stsRecovery(請求恢復(fù)能力) -如果一個Job具備“請求恢復(fù)”能力,當(dāng)它在執(zhí)行時遇到scheduler “硬性的關(guān)閉” (例如:執(zhí)行的過程崩潰,或者計算機(jī)被關(guān)機(jī)),那么當(dāng)scheduler重新啟動時,這個任務(wù)會被重新執(zhí)行。 這種情況下,JobExecutionContext.isRecovering() 屬性將是true。 JobListeners(任務(wù)監(jiān)聽器) -一個Job如果有0個或者多個JobListeners監(jiān)聽器與之相關(guān)聯(lián),當(dāng)這個Job執(zhí)行時,監(jiān)聽器被會被通知。 更多有關(guān)JobListeners的討論見TriggerListeners & JobListeners章節(jié)。Jo
26、bExecutionException 任務(wù)執(zhí)行異常 最后,需要告訴你一些關(guān)于Job.Execute(.)方法的細(xì)節(jié)。在Execute方法被執(zhí)行時,僅允許拋出一個JobExecutionException類型異常。因此需要將整個要執(zhí)行的內(nèi)容包括在一個try-catch塊中。應(yīng)花費(fèi)一些時間仔細(xì)閱讀JobExecutionException文檔,因?yàn)镴ob能夠使用它向scheduler提供各種指示,你也可以知道怎么處理異常。1.4 Quartz手冊java版-(四)關(guān)于Triggers更多內(nèi)容同Job一樣,trigger非常容易使用,但它有一些可選項(xiàng)需要注意和理解,同時,trigger有不同的類型
27、,要按照需求進(jìn)行選擇。 Calendars日歷 Quartz Calendar對象在trigger被存儲到scheduler時與trigger相關(guān)聯(lián)。Calendar對于在trigger觸發(fā)日程中的采用批量世間非常有用。例如:你想要創(chuàng)建一個在每個工作日上午9:30觸發(fā)一個觸發(fā)器,那么就添加一個排除所有節(jié)假日的日歷。 Calendar可以是任何實(shí)現(xiàn)Calendar接口的序列化對象??雌饋砣缦拢?package org.quartz;public interface Calendar public boolean isTimeIncluded(long timeStamp);public long
28、 getNextIncludedTime(long timeStamp);注意,這些方法的參數(shù)都是DateTime型,你可以猜想出,它們的時間戳是毫秒的格式。這意味日歷能夠排除毫秒精度的時間。最可能的是,你可能對排除整天的時間感興趣。為了提供方便,Quartz提供了一個Quartz.Impl.Calendar.HolidayCalendar,這個類可以排除整天的時間。Calendars必須被實(shí)例化,然后通過addCalendar (.)方法注冊到scheduler中。如果使用HolidayCalendar,在實(shí)例化之后,你可以使用它的AddExcludedDate (DateTime excl
29、udedDate)方法來定義你想要從日程表中排除的時間。同一個calendar實(shí)例可以被用于多個trigger中,如下:HolidayCalendar cal = new HolidayCalendar();cal.addExcludedDate( someDate );sched.addCalendar(myHolidays, cal, false);Trigger trigger = TriggerUtils.makeHourlyTrigger(); / fire every one hour intervaltrigger.setStartTime(TriggerUtils.getEve
30、nHourDate(new Date(); / start on the next even hourtrigger.setName(myTrigger1);trigger.setCalendarName(myHolidays);/ . schedule job with triggerTrigger trigger2 = TriggerUtils.makeDailyTrigger(8, 0); / fire every day at 08:00trigger.setStartTime(new Date(); / begin immediatelytrigger2.setName(myTrig
31、ger2);trigger2.setCalendarName(myHolidays);/ . schedule job with trigger2傳入SimpleTrigger構(gòu)造函數(shù)的參數(shù)的細(xì)節(jié)將在下章中介紹。但是,任何在日歷中被排除的時間所要進(jìn)行的觸發(fā)都被取消。Priority有時,當(dāng)有多個Triggers時,Quartz沒有足夠的資源來同時立即處理scheduled的trigger.所以你可能要控制哪個先執(zhí)行.在這種情況下,你要設(shè)置Trigger的priority,如果N個triggers不會同時觸發(fā).但此時只有有限的幾個線程可用.這時會先處理級別高的trigger.如果你沒有設(shè)置級別,
32、默認(rèn)為5,下面為一個例子:Calendar cal = Calendar.getInstance();cal.add(Calendar.MINUTE, 5);Trigger trig1 = new SimpleTrigger(T1, MyGroup, cal.getTime();Trigger trig2 = new SimpleTrigger(T2, MyGroup, cal.getTime();Trigger trig3 = new SimpleTrigger(T3, MyGroup, cal.getTime();JobDetail jobDetail = new JobDetail(My
33、Job, MyGroup, NoOpJob.class);/ Trigger1 does not have its priority set, so it defaults to 5sched.scheduleJob(jobDetail, trig1);/ Trigger2 has its priority set to 10trig2.setJobName(jobDetail.getName();trig2.setPriority(10);sched.scheduleJob(trig2);/ Trigger2 has its priority set to 1trig3.setJobName
34、(jobDetail.getName();trig2.setPriority(1);sched.scheduleJob(trig3);/ Five minutes from now, when the scheduler invokes these three triggers/ they will be allocated worker threads in decreasing order of their/ priority: Trigger2(10), Trigger1(5), Trigger3(1)Misfire Instructions未觸發(fā)指令 Trigger的另一個重要屬性就是
35、它的“misfire instruction(未觸發(fā)指令)”。如果因?yàn)閟cheduler被關(guān)閉而導(dǎo)致持久的觸發(fā)器“錯過”了觸發(fā)時間,這時,未觸發(fā)就發(fā)生了。不同類型的觸發(fā)器有不同的未觸發(fā)指令。缺省情況下,他們會使用一個“智能策略”指令根據(jù)觸發(fā)器類型和配置的不同產(chǎn)生不同動作。當(dāng)scheduler開始時,它查找所有未觸發(fā)的持久triggers,然后按照每個觸發(fā)器所配置的未觸發(fā)指令來更新它們。開始工程中使用Quartz的時,應(yīng)熟悉定義在各個類型觸發(fā)器上的未觸發(fā)指令。關(guān)于未觸發(fā)指令信息的詳細(xì)說明將在每種特定的類型觸發(fā)器的指南課程中給出。可以通過MisfireInstruction屬性來為給定的觸發(fā)器實(shí)例
36、配置未觸發(fā)指令。TriggerUtils - Triggers Made Easy(TriggerUtils使Triggers變得容易) TriggerUtils類包含了創(chuàng)建觸發(fā)器以及日期的便捷方法。使用這個類可以輕松地使觸發(fā)器在每分鐘,小時,日,星期,月等觸發(fā)。使用這個類也可以產(chǎn)生距離觸發(fā)最近的妙、分或者小時,這對設(shè)定觸發(fā)開始時間非常有用。TriggerListeners 最后,如同job一樣,triggers可以注冊監(jiān)聽器,實(shí)現(xiàn)TriggerListener接口的對象將可以收到觸發(fā)器被觸發(fā)的通知。1.5 Quartz手冊java版-(五) SimpleTrigger如果需要讓任務(wù)只在某個時
37、刻執(zhí)行一次,或者,在某個時刻開始,然后按照某個時間間隔重復(fù)執(zhí)行,簡單地說,如果你想讓觸發(fā)器在2007年8月20日上午11:23:54秒執(zhí)行,然后每個隔10秒鐘重復(fù)執(zhí)行一次,并且這樣重復(fù)5次。那么SimpleTrigger 就可以滿足你的要求。通過這樣的描述,你可能很驚奇地發(fā)現(xiàn)SimpleTrigger包括這些屬性:開始時間,結(jié)束時間,重復(fù)次數(shù),重復(fù)間隔。所有這屬性都是你期望它所應(yīng)具備的,只有end-time屬性有一些條目與之關(guān)聯(lián)。重復(fù)次數(shù)可能是0,正數(shù)或者一個常量值SimpleTrigger.REPEAT_INDEFINITELY。重復(fù)間隔時間屬性可能是0,正的long型,這個數(shù)字以毫秒為單位
38、。注意:如果指定的重復(fù)間隔時間是0,那么會導(dǎo)致觸發(fā)器按照重復(fù)數(shù)量定義的次數(shù)并發(fā)觸發(fā)(或者接近并發(fā))。 org.quartz.helpers.TriggerUtils 類對處理這樣的循環(huán)也提供了很多支持。endTime(如果這個屬性被設(shè)置)屬性會覆蓋重復(fù)次數(shù)屬性,這對創(chuàng)建一個每隔10秒就觸發(fā)一次直到某個時間結(jié)束的觸發(fā)器非常有用,這就可以不計算開始時間和結(jié)束時間之間的重復(fù)數(shù)量。也可以指定一個結(jié)束時間,然后使用REPEAT_INDEFINITELY作為重復(fù)數(shù)量。(甚至可以指定一個大于結(jié)束時間之前實(shí)際重復(fù)次數(shù)的整數(shù)作為重復(fù)次數(shù))。一句話,endTime屬性控制權(quán)高于重復(fù)次數(shù)屬性。SimpleTrigg
39、er有幾個不同的構(gòu)造函數(shù),下面我們來看看這結(jié)果構(gòu)造函數(shù):public SimpleTrigger(String name, String group,Date startTime,Date endTime,int repeatCount,long repeatInterval)SimpleTrigger Example 1 - Create a trigger that fires exactly once, ten seconds from nowlong startTime = System.currentTimeMillis() + 10000L;SimpleTrigger trigge
40、r = new SimpleTrigger(myTrigger, null,new Date(startTime),null,0,0L);SimpleTrigger Example 2 - Create a trigger that fires immediately, then repeats every 60 seconds, foreverSimpleTrigger trigger = new SimpleTrigger(myTrigger, null, new Date(),null,SimpleTrigger.REPEAT_INDEFINITELY,60L * 1000L);Simp
41、leTrigger Example 3 - Create a trigger that fires immediately, then repeats every 10 seconds until 40 seconds from nowlong endTime = System.currentTimeMillis() + 40000L;SimpleTrigger trigger = new SimpleTrigger(myTrigger,myGroup, new Date(),new Date(endTime), SimpleTrigger.REPEAT_INDEFINITELY,10L *
42、1000L);SimpleTrigger Example 4 - Create a trigger that fires on March 17 of the year 2002 at precisely 10:30 am, and repeats 5 times (for a total of 6 firings) - with a 30 second delay between each firingjava.util.Calendar cal = new java.util.GregorianCalendar(2002, cal.MARCH, 17);cal.set(cal.HOUR,
43、10);cal.set(cal.MINUTE, 30);cal.set(cal.SECOND, 0);cal.set(cal.MILLISECOND, 0);Data startTime = cal.getTime()SimpleTrigger trigger = new SimpleTrigger(myTrigger, null, startTime,null,5,30L * 1000L);SimpleTrigger Misfire InstructionsSimpleTrigger的未觸發(fā)指令 “未觸發(fā)”發(fā)生時,SimpleTrigger有幾個指令可以用來通知Quartz進(jìn)行相關(guān)處理。(“
44、未觸發(fā)”在上節(jié)課中介紹過了)。這些指令以常量形式定義在SimpleTrigger本身,這些指令如下:MISFIRE_INSTRUCTION_FIRE_NOWMISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNTMISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNTMISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNTMISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EX
45、ISTING_COUNT回顧前面的課程你可以知道,每個觸發(fā)器都有一個Trigger.MISFIRE_INSTRUCTION_SMART_POLICY指令可用,并且,這個指令對于每個類型的觸發(fā)器都是缺省的。如果使用 smart policy 指令,SimpleTriger會基于配置和SimpleTrigger實(shí)例的狀態(tài)動態(tài)的選擇上面的指令.SimpleTrigger.updateAfterMisfire() 會獲取動態(tài)行為的詳細(xì)信息.1.6 Quartz手冊java版-(六)CronTrigger如果你需要像日歷那樣按日程來觸發(fā)任務(wù),而不是像SimpleTrigger 那樣每隔特定的間隔時間觸發(fā)
46、,CronTriggers通常比SimpleTrigger更有用。使用CronTrigger,你可以指定諸如“每個周五中午”,或者“每個工作日的9:30”或者“從每個周一、周三、周五的上午9:00到上午10:00之間每隔五分鐘”這樣日程安排來觸發(fā)。甚至,象SimpleTrigger一樣,CronTrigger也有一個StartTime以指定日程從什么時候開始,也有一個(可選的)EndTime以指定何時日程不再繼續(xù)。Cron表達(dá)式被用來配置CronTrigger實(shí)例。Cron表達(dá)式是一個由7個子表達(dá)式組成的字符串。每個子表達(dá)式都描述了一個單獨(dú)的日程細(xì)節(jié)。這些子表達(dá)式用空格分隔,分別表示: 1.
47、Seconds 秒 2. Minutes 分鐘 3. Hours 小時 4. Day-of-Month 月中的天 5. Month 月 6. Day-of-Week 周中的天 7. Year (optional field) 年(可選的域) 一個cron表達(dá)式的例子字符串為0 0 12 ? * WED,這表示“每周三的中午12:00”。單個子表達(dá)式可以包含范圍或者列表。例如:前面例子中的周中的天這個域(這里是WED)可以被替換為MON-FRI, MON, WED, FRI或者甚至MON-WED,SAT。 通配符(*)可以被用來表示域中“每個”可能的值。因此在Month域中的*表示每個月,而在D
48、ay-Of-Week域中的*則表示“周中的每一天”。 所有的域中的值都有特定的合法范圍,這些值的合法范圍相當(dāng)明顯,例如:秒和分域的合法值為0到59,小時的合法范圍是0到23,Day-of-Month中值得合法凡范圍是0到31,但是需要注意不同的月份中的天數(shù)不同。月份的合法值是0到11?;蛘哂米址甁AN,FEB MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 及DEC來表示。Days-of-Week可以用1到7來表示(1=星期日)或者用字符串SUN, MON, TUE, WED, THU, FRI 和SAT來表示./字符用來表示值的增量,例如, 如果分鐘
49、域中放入0/15,它表示“每隔15分鐘,從0開始”,如果在份中域中使用3/20,則表示“小時中每隔20分鐘,從第3分鐘開始”或者另外相同的形式就是3,23,43。?字符可以用在day-of-month及day-of-week域中,它用來表示“沒有指定值”。這對于需要指定一個或者兩個域的值而不需要對其他域進(jìn)行設(shè)置來說相當(dāng)有用。L字符可以在day-of-month及day-of-week中使用,這個字符是last的簡寫,但是在兩個域中的意義不同。例如,在day-of-month域中的L表示這個月的最后一天,即,一月的31日,非閏年的二月的28日。如果它用在day-of-week中,則表示7或者SA
50、T。但是如果在day-of-week域中,這個字符跟在別的值后面,則表示當(dāng)月的最后的周XXX。例如:6L 或者 FRIL都表示本月的最后一個周五。當(dāng)使用L選項(xiàng)時,最重要的是不要指定列表或者值范圍,否則會導(dǎo)致混亂。W 字符用來指定距離給定日最接近的周幾(在day-of-week域中指定)。例如:如果你為day-of-month域指定為15W,則表示“距離月中15號最近的周幾”。#表示表示月中的第幾個周幾。例如:day-of-week域中的6#3 或者 FRI#3表示“月中第三個周五”。例1 一個簡單的每隔5分鐘觸發(fā)一次的表達(dá)式 0 0/5 * * * ? CronTrigger例2 在每分鐘的1
51、0秒后每隔5分鐘觸發(fā)一次的表達(dá)式(例如. 10:00:10 am, 10:05:10等.)。 10 0/5 * * * ? CronTrigger 例3 在每個周三和周五的10:30,11:30,12:30觸發(fā)的表達(dá)式。 0 30 10-13 ? * WED,FRI CronTrigger 例4 在每個月的5號,20號的8點(diǎn)和10點(diǎn)之間每隔半個小時觸發(fā)一次且不包括10點(diǎn),只是8:30,9:00和9:30的表達(dá)式。 0 0/30 8-9 5,20 * ? 注意,對于單獨(dú)觸發(fā)器來說,有些日程需求可能過于復(fù)雜而不能用表達(dá)式表述, 例如:9:00到10:00之間每隔5分鐘觸發(fā)一次,下午1:00到10點(diǎn)
52、每隔20分鐘觸發(fā)一次。這個解決方案就是創(chuàng)建兩個觸發(fā)器,兩個觸發(fā)器都運(yùn)行相同的任務(wù)。1.7 Quartz手冊java版-(七)TriggerListeners和JobListeners監(jiān)聽器是在scheduler事件發(fā)生時能夠執(zhí)行動作的對象??梢钥闯觯琓riggerListeners接收與triggers相關(guān)的事件,而JobListeners則接收與Job相關(guān)的事件。Trigger相關(guān)的事件包括:trigger觸發(fā)、trigger未觸發(fā),以及trigger完成(由trigger觸發(fā)的任務(wù)被完成)。public interface TriggerListener public String get
53、Name(); public void triggerFired(Trigger trigger, JobExecutionContext context); public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context); public void triggerMisfired(Trigger trigger); public void triggerComplete(Trigger trigger, JobExecutionContext context, int triggerInstructio
54、nCode);任務(wù)相關(guān)的事件包括:即將被執(zhí)行的任務(wù)的通知和任務(wù)已經(jīng)執(zhí)行完畢的通知。public interface JobListener public String getName(); public void jobToBeExecuted(JobExecutionContext context); public void jobExecutionVetoed(JobExecutionContext context); public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobExcep
55、tion);使用你自定義的監(jiān)聽器創(chuàng)建監(jiān)聽器很簡單,創(chuàng)建一個實(shí)現(xiàn)org.quartz.TriggerListener and/or org.quartz.JobListener 的接口。監(jiān)聽器然后在執(zhí)行的時候注冊到scheduler中,而且必須給定一個名字(或者,它們必須通過他們的Name屬性來介紹自己)。監(jiān)聽器可以被注冊為“全局”的或者“非全局”?!叭帧北O(jiān)聽器接收所有triggers/jobs產(chǎn)生的事件,而“非全局”監(jiān)聽器只接受那些通過getTriggerListenerNames() 或 getJobListenerNames()方法顯式指定監(jiān)聽器名的triggers/jobs所產(chǎn)生的事件。正如上面所說的那樣,監(jiān)聽器在運(yùn)行時向scheduler注冊,并且不被存儲在jobs 和triggers的JobStore中。Jobs和Trigger只存儲了與他們相關(guān)的監(jiān)聽器的名字。因此,每次應(yīng)用運(yùn)行的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年衛(wèi)生院勞動合同書范例
- 云端數(shù)據(jù)存儲服務(wù)合同
- 2025年加油站經(jīng)營轉(zhuǎn)讓策劃合同模板
- 國際采購貨物進(jìn)口合同模板
- 2025年住宅小區(qū)物業(yè)管理策劃外包合同
- 2025年區(qū)域總代理合同格式
- 教育慈善捐贈合同書模板
- 2025年居民小區(qū)車位租賃合同
- 2025年供應(yīng)鏈合作協(xié)議合同范本
- 2025年創(chuàng)業(yè)投資意向合同
- 2025年常德科技職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫帶答案
- 電子教案-《網(wǎng)絡(luò)設(shè)備配置與管理》
- 溫州2025年浙江溫州市生態(tài)環(huán)境科學(xué)研究院招聘筆試歷年參考題庫附帶答案詳解
- 2.1揭開情緒的面紗 課件 2024-2025學(xué)年統(tǒng)編版道德與法治七年級下冊
- 特色天麻種源基地建設(shè)實(shí)施方案
- 家政服務(wù)人員安全培訓(xùn)
- 2024校醫(yī)校園心理危機(jī)干預(yù)與心理咨詢服務(wù)合同3篇
- DSS7016管理端操作手冊
- 工業(yè)廢鹽資源化利用項(xiàng)目可行性研究報告
- 應(yīng)急預(yù)案桌面推演腳本
- 《外傷性顱內(nèi)積氣》課件
評論
0/150
提交評論