版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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è)調度圖書館 Quartz是一個功能豐富的,開源的作業(yè)調度庫,可以在幾乎任何Java應用程序集成 - 從最小的獨立的應用程序,以最大的電子商務系統(tǒng)。 Quartz可以用來創(chuàng)建簡單或復雜的調度執(zhí)行幾十,幾百,甚至是數(shù)萬名成千上萬的就業(yè)機會; job被定義為標準的Java組件可以執(zhí)行幾乎任何你可以編程他們做。 Quartz調度包括了許多企業(yè)級特性,如JTA事務和集群支持。 Quartz是可自
4、由使用的,基于Apache2.0許可協(xié)議發(fā)布。目錄1.1 Quartz手冊java版-(一)使用Quartz11.2 Quartz手冊java版-(二)Jobs And Triggers21.3 Quartz手冊java版-(三)更多關于Jobs和JobDetails41.4 Quartz手冊java版-(四)關于Triggers更多內容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之前應首先實例化它。使用SchedulerFactory可以完成scheduler的實例化。用戶可直接地實例化這個工廠類并且直接使用工廠的實例(例
6、如下面的例子)。 一旦一個scheduler被實例化,它就可以被啟動(start),并且處于駐留模式,直到被關閉(shutdown)。注意,一旦scheduler被關閉(shutdown),則它不能再重新啟動,除非重新實例化它。除非scheduler 被啟動或者不處于暫停狀態(tài),否則觸發(fā)器不會被觸發(fā)(任務也不能被執(zhí)行)。 下面是一個代碼片斷,這個代碼片斷實例化并且啟動了一個scheduler,接著將一個要執(zhí)行的任務納入了進程。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相當簡單,在第二課中,我們將給出一個Job和Trigger的快速預覽,這樣就能夠充分理解這個例子。1.2 Quartz手冊java版-(二)Jobs And Triggers正如前面所提到的那樣,通過實現(xiàn)Job接口來使你的.NET組件可以很簡單地被scheduler執(zhí)行。下面是Job接口:package org.quartz;public interface Job public void execute(JobExecutionContext context) throws JobExecutionExc
9、eption;這樣,你會猜想出,當Job觸發(fā)器觸發(fā)時(在某個時刻),Execute (.)就被scheduler所調用。JobExecutionContext對象被傳遞給這個方法,它為Job實例提供了它的“運行時”環(huán)境-一個指向執(zhí)行這個IJob實例的Scheduler句柄,一個指向觸發(fā)該次執(zhí)行的觸發(fā)器的句柄,IJob的JobDetail對象以及一些其他的條目。JobDetail對象由Quartz客戶端在Job被加入到scheduler時創(chuàng)建。它包含了Job的各種設置屬性以及一個JobDataMap對象,這個對象被用來存儲給定Job類實例的狀態(tài)信息。Trigger對象被用來觸發(fā)jobs的執(zhí)行。你
10、希望將任務納入到進度,要實例化一個Trigger并且“調整”它的屬性以滿足你想要的進度安排。Triggers也有一個JobDataMap與之關聯(lián),這非常有利于向觸發(fā)器所觸發(fā)的Job傳遞參數(shù)。Quartz打包了很多不同類型的Trigger,但最常用的Trigge類是SimpleTrigger和CronTrigger。SimpleTrigger用來觸發(fā)只需執(zhí)行一次或者在給定時間觸發(fā)并且重復N次且每次執(zhí)行延遲一定時間的任務。CronTrigger按照日歷觸發(fā),例如“每個周五”,每個月10日中午或者10:15分。 為什么要分為Jobs和Triggers?很多任務日程管理器沒有將Jobs和Trigger
11、s進行區(qū)分。一些產品中只是將“job”簡單地定義為一個帶有一些小任務標識的執(zhí)行時間。其他產品則更像Quartz中job和trigger的聯(lián)合。而開發(fā)Quartz的時候,我們決定對日程和按照日程執(zhí)行的工作進行分離。(從我們的觀點來看)這有很多好處。 例如:jobs可以被創(chuàng)建并且存儲在job scheduler中,而不依賴于trigger,而且,很多triggers可以關聯(lián)一個job.另外的好處就是這種“松耦合”能使與日程中的Job相關的trigger過期后重新配置這些Job,這樣以后就能夠重新將這些Job納入日程而不必重新定義它們。這樣就可以更改或者替換trigger而不必重新定義與之相連的jo
12、b標識符。當向Quartz scheduler中注冊Jobs 和Triggers時,它們要給出標識它們的名字。Jobs 和Triggers也可以被放入“組”中。“組”對于后續(xù)維護過程中,分類管理Jobs和Triggers非常有用。Jobs和Triggers的名字在組中必須唯一,換句話說,Jobs和Triggers真實名字是它的名字+組。如果使Job或者Trigger的組為null,這等價于將其放入缺省的Scheduler.DEFAULT_GROUP組中。1.3 Quartz手冊java版-(三)更多關于Jobs和JobDetails如你所見,Job相當容易實現(xiàn)。這里只是介紹有關Jobs本質,
13、Job接口的Execute(.)方法以及JobDetails中需要理解的內容。在所實現(xiàn)的類成為真正的“Job”時,期望任務所具有的各種屬性需要通知給Quartz。通過JobDetail類可以完成這個工作,這個類在前面的章節(jié)中曾簡短提及過?,F(xiàn)在,我們花一些時間來討論Quartz中Jobs的本質和Job實例的生命周期。首先讓我們回顧一下第一課中所看到的代碼片斷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實例,JobDetail關聯(lián)一個job,提供job的class,每次scheduler執(zhí)行job時,在執(zhí)行execute(.)這前會創(chuàng)建一個實例.job必須有一個無參構造方法.你可能想問如何提供配置 job實例.或者保存job狀態(tài)在執(zhí)行過程中.答案是JobDataMap.它是JobDetail的一部分.JobDataMap JobDataM
16、ap被用來保存一系列的(序列化的)對象,這些對象在Job執(zhí)行時可以得到。JobDataMap是Map接口的一個實現(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中的內容。因為放入JobDataMa
19、p中的內容將被序列化,而且容易出現(xiàn)類型轉換問題。很明顯,標準.NET類型將是非常安全的,但除此之外的類型,任何時候,只要有人改變了你要序列化其實例的類的定義,就要注意是否打破了程序的兼容性。另外,你可以對JobStore和JobDataMap采用一種使用模式:就是只把主類型和String類型存放在Map中,這樣就可以減少后面序列化的問題。Triggers也可以有JobDataMaps與之相關聯(lián)。當scheduler中的Job被多個有規(guī)律或者重復觸發(fā)的Triggers所使用時非常有用。對于每次獨立的觸發(fā),你可為Job提供不同的輸入數(shù)據(jù)。 從Job執(zhí)行時的JobExecutionContext中取
20、得JobDataMap是慣用手段,它融合了從JobDetail和從Trigger中獲的JobDataMap,當有相同名字的鍵時,它用后者的值覆蓋前者值。下面給一個例子取數(shù)據(jù)從JobExecutionContext 關聯(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)任務 現(xiàn)在,一些關于Job狀態(tài)數(shù)據(jù)的附加論題:一個Job實例可以被定義為“有狀態(tài)的”或者“無狀態(tài)的”?!盁o狀態(tài)的”任務只擁有它們被加入到scheduler時所存儲的JobDataMap。這意味著,在執(zhí)行任務過程中任何對Job Data Map所作的更改都將丟失而且任務下次執(zhí)行時也無法看到。你可能會猜想出,有狀態(tài)的任務恰好相反,它在任務的每次執(zhí)行之后重新存儲
23、JobDataMap。有狀態(tài)任務的一個副作用就是它不能并發(fā)執(zhí)行。換句話說,如果任務有狀態(tài),那么當觸發(fā)器在這個任務已經(jīng)在執(zhí)行的時候試圖觸發(fā)它,這個觸發(fā)器就會被阻塞(等待),直到前面的執(zhí)行完成。 想使任務有狀態(tài),它就要實現(xiàn)StatefulJob 接口而不是實現(xiàn)Job接口.Job Instances 任務“實例” 這個課程的最終觀點或許已經(jīng)很明確,可以創(chuàng)建一個單獨的Job類,并且通過創(chuàng)建多個JobDetails實例來將它的多個實例存儲在scheduler中,這樣每個JobDetails對象都有它自己的一套屬性和JobDataMap,而且將它們都加入到scheduler中。當觸發(fā)器被觸發(fā)的時候,通過S
24、cheduler中配置的JobFactory來實例化與之關聯(lián)的Job類。缺省的JobFactory只是簡單地對Job類調用newInstance()方法。創(chuàng)建自己JobFactory可以利用應用中諸如Ioc或者DI容器所產生或者初始化的Job實例。jobs的其它屬性 這里簡短地總結一下通過JobDetail對象可以定義Job的其它屬性。 Durability(持久性)-如果一個Job是不持久的, 一旦沒有觸發(fā)器與之關聯(lián),它就會被從scheduler 中自動刪除。 Volatility(無常性)-如果一個Job是無常的,在重新啟動Quartz i scheduler 時它不能被保持。 Reque
25、stsRecovery(請求恢復能力) -如果一個Job具備“請求恢復”能力,當它在執(zhí)行時遇到scheduler “硬性的關閉” (例如:執(zhí)行的過程崩潰,或者計算機被關機),那么當scheduler重新啟動時,這個任務會被重新執(zhí)行。 這種情況下,JobExecutionContext.isRecovering() 屬性將是true。 JobListeners(任務監(jiān)聽器) -一個Job如果有0個或者多個JobListeners監(jiān)聽器與之相關聯(lián),當這個Job執(zhí)行時,監(jiān)聽器被會被通知。 更多有關JobListeners的討論見TriggerListeners & JobListeners章節(jié)。Jo
26、bExecutionException 任務執(zhí)行異常 最后,需要告訴你一些關于Job.Execute(.)方法的細節(jié)。在Execute方法被執(zhí)行時,僅允許拋出一個JobExecutionException類型異常。因此需要將整個要執(zhí)行的內容包括在一個try-catch塊中。應花費一些時間仔細閱讀JobExecutionException文檔,因為Job能夠使用它向scheduler提供各種指示,你也可以知道怎么處理異常。1.4 Quartz手冊java版-(四)關于Triggers更多內容同Job一樣,trigger非常容易使用,但它有一些可選項需要注意和理解,同時,trigger有不同的類型
27、,要按照需求進行選擇。 Calendars日歷 Quartz Calendar對象在trigger被存儲到scheduler時與trigger相關聯(lián)。Calendar對于在trigger觸發(fā)日程中的采用批量世間非常有用。例如:你想要創(chuàng)建一個在每個工作日上午9:30觸發(fā)一個觸發(fā)器,那么就添加一個排除所有節(jié)假日的日歷。 Calendar可以是任何實現(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必須被實例化,然后通過addCalendar (.)方法注冊到scheduler中。如果使用HolidayCalendar,在實例化之后,你可以使用它的AddExcludedDate (DateTime excl
29、udedDate)方法來定義你想要從日程表中排除的時間。同一個calendar實例可以被用于多個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構造函數(shù)的參數(shù)的細節(jié)將在下章中介紹。但是,任何在日歷中被排除的時間所要進行的觸發(fā)都被取消。Priority有時,當有多個Triggers時,Quartz沒有足夠的資源來同時立即處理scheduled的trigger.所以你可能要控制哪個先執(zhí)行.在這種情況下,你要設置Trigger的priority,如果N個triggers不會同時觸發(fā).但此時只有有限的幾個線程可用.這時會先處理級別高的trigger.如果你沒有設置級別,
32、默認為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ā)指令)”。如果因為scheduler被關閉而導致持久的觸發(fā)器“錯過”了觸發(fā)時間,這時,未觸發(fā)就發(fā)生了。不同類型的觸發(fā)器有不同的未觸發(fā)指令。缺省情況下,他們會使用一個“智能策略”指令根據(jù)觸發(fā)器類型和配置的不同產生不同動作。當scheduler開始時,它查找所有未觸發(fā)的持久triggers,然后按照每個觸發(fā)器所配置的未觸發(fā)指令來更新它們。開始工程中使用Quartz的時,應熟悉定義在各個類型觸發(fā)器上的未觸發(fā)指令。關于未觸發(fā)指令信息的詳細說明將在每種特定的類型觸發(fā)器的指南課程中給出??梢酝ㄟ^MisfireInstruction屬性來為給定的觸發(fā)器實例
36、配置未觸發(fā)指令。TriggerUtils - Triggers Made Easy(TriggerUtils使Triggers變得容易) TriggerUtils類包含了創(chuàng)建觸發(fā)器以及日期的便捷方法。使用這個類可以輕松地使觸發(fā)器在每分鐘,小時,日,星期,月等觸發(fā)。使用這個類也可以產生距離觸發(fā)最近的妙、分或者小時,這對設定觸發(fā)開始時間非常有用。TriggerListeners 最后,如同job一樣,triggers可以注冊監(jiān)聽器,實現(xiàn)TriggerListener接口的對象將可以收到觸發(fā)器被觸發(fā)的通知。1.5 Quartz手冊java版-(五) SimpleTrigger如果需要讓任務只在某個時
37、刻執(zhí)行一次,或者,在某個時刻開始,然后按照某個時間間隔重復執(zhí)行,簡單地說,如果你想讓觸發(fā)器在2007年8月20日上午11:23:54秒執(zhí)行,然后每個隔10秒鐘重復執(zhí)行一次,并且這樣重復5次。那么SimpleTrigger 就可以滿足你的要求。通過這樣的描述,你可能很驚奇地發(fā)現(xiàn)SimpleTrigger包括這些屬性:開始時間,結束時間,重復次數(shù),重復間隔。所有這屬性都是你期望它所應具備的,只有end-time屬性有一些條目與之關聯(lián)。重復次數(shù)可能是0,正數(shù)或者一個常量值SimpleTrigger.REPEAT_INDEFINITELY。重復間隔時間屬性可能是0,正的long型,這個數(shù)字以毫秒為單位
38、。注意:如果指定的重復間隔時間是0,那么會導致觸發(fā)器按照重復數(shù)量定義的次數(shù)并發(fā)觸發(fā)(或者接近并發(fā))。 org.quartz.helpers.TriggerUtils 類對處理這樣的循環(huán)也提供了很多支持。endTime(如果這個屬性被設置)屬性會覆蓋重復次數(shù)屬性,這對創(chuàng)建一個每隔10秒就觸發(fā)一次直到某個時間結束的觸發(fā)器非常有用,這就可以不計算開始時間和結束時間之間的重復數(shù)量。也可以指定一個結束時間,然后使用REPEAT_INDEFINITELY作為重復數(shù)量。(甚至可以指定一個大于結束時間之前實際重復次數(shù)的整數(shù)作為重復次數(shù))。一句話,endTime屬性控制權高于重復次數(shù)屬性。SimpleTrigg
39、er有幾個不同的構造函數(shù),下面我們來看看這結果構造函數(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進行相關處理。(“
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實例的狀態(tài)動態(tài)的選擇上面的指令.SimpleTrigger.updateAfterMisfire() 會獲取動態(tài)行為的詳細信息.1.6 Quartz手冊java版-(六)CronTrigger如果你需要像日歷那樣按日程來觸發(fā)任務,而不是像SimpleTrigger 那樣每隔特定的間隔時間觸發(fā)
46、,CronTriggers通常比SimpleTrigger更有用。使用CronTrigger,你可以指定諸如“每個周五中午”,或者“每個工作日的9:30”或者“從每個周一、周三、周五的上午9:00到上午10:00之間每隔五分鐘”這樣日程安排來觸發(fā)。甚至,象SimpleTrigger一樣,CronTrigger也有一個StartTime以指定日程從什么時候開始,也有一個(可選的)EndTime以指定何時日程不再繼續(xù)。Cron表達式被用來配置CronTrigger實例。Cron表達式是一個由7個子表達式組成的字符串。每個子表達式都描述了一個單獨的日程細節(jié)。這些子表達式用空格分隔,分別表示: 1.
47、Seconds 秒 2. Minutes 分鐘 3. Hours 小時 4. Day-of-Month 月中的天 5. Month 月 6. Day-of-Week 周中的天 7. Year (optional field) 年(可選的域) 一個cron表達式的例子字符串為0 0 12 ? * WED,這表示“每周三的中午12:00”。單個子表達式可以包含范圍或者列表。例如:前面例子中的周中的天這個域(這里是WED)可以被替換為MON-FRI, MON, WED, FRI或者甚至MON-WED,SAT。 通配符(*)可以被用來表示域中“每個”可能的值。因此在Month域中的*表示每個月,而在D
48、ay-Of-Week域中的*則表示“周中的每一天”。 所有的域中的值都有特定的合法范圍,這些值的合法范圍相當明顯,例如:秒和分域的合法值為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域中,它用來表示“沒有指定值”。這對于需要指定一個或者兩個域的值而不需要對其他域進行設置來說相當有用。L字符可以在day-of-month及day-of-week中使用,這個字符是last的簡寫,但是在兩個域中的意義不同。例如,在day-of-month域中的L表示這個月的最后一天,即,一月的31日,非閏年的二月的28日。如果它用在day-of-week中,則表示7或者SA
50、T。但是如果在day-of-week域中,這個字符跟在別的值后面,則表示當月的最后的周XXX。例如:6L 或者 FRIL都表示本月的最后一個周五。當使用L選項時,最重要的是不要指定列表或者值范圍,否則會導致混亂。W 字符用來指定距離給定日最接近的周幾(在day-of-week域中指定)。例如:如果你為day-of-month域指定為15W,則表示“距離月中15號最近的周幾”。#表示表示月中的第幾個周幾。例如:day-of-week域中的6#3 或者 FRI#3表示“月中第三個周五”。例1 一個簡單的每隔5分鐘觸發(fā)一次的表達式 0 0/5 * * * ? CronTrigger例2 在每分鐘的1
51、0秒后每隔5分鐘觸發(fā)一次的表達式(例如. 10:00:10 am, 10:05:10等.)。 10 0/5 * * * ? CronTrigger 例3 在每個周三和周五的10:30,11:30,12:30觸發(fā)的表達式。 0 30 10-13 ? * WED,FRI CronTrigger 例4 在每個月的5號,20號的8點和10點之間每隔半個小時觸發(fā)一次且不包括10點,只是8:30,9:00和9:30的表達式。 0 0/30 8-9 5,20 * ? 注意,對于單獨觸發(fā)器來說,有些日程需求可能過于復雜而不能用表達式表述, 例如:9:00到10:00之間每隔5分鐘觸發(fā)一次,下午1:00到10點
52、每隔20分鐘觸發(fā)一次。這個解決方案就是創(chuàng)建兩個觸發(fā)器,兩個觸發(fā)器都運行相同的任務。1.7 Quartz手冊java版-(七)TriggerListeners和JobListeners監(jiān)聽器是在scheduler事件發(fā)生時能夠執(zhí)行動作的對象??梢钥闯?,TriggerListeners接收與triggers相關的事件,而JobListeners則接收與Job相關的事件。Trigger相關的事件包括:trigger觸發(fā)、trigger未觸發(fā),以及trigger完成(由trigger觸發(fā)的任務被完成)。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);任務相關的事件包括:即將被執(zhí)行的任務的通知和任務已經(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)建一個實現(xiàn)org.quartz.TriggerListener and/or org.quartz.JobListener 的接口。監(jiān)聽器然后在執(zhí)行的時候注冊到scheduler中,而且必須給定一個名字(或者,它們必須通過他們的Name屬性來介紹自己)。監(jiān)聽器可以被注冊為“全局”的或者“非全局”?!叭帧北O(jiān)聽器接收所有triggers/jobs產生的事件,而“非全局”監(jiān)聽器只接受那些通過getTriggerListenerNames() 或 getJobListenerNames()方法顯式指定監(jiān)聽器名的triggers/jobs所產生的事件。正如上面所說的那樣,監(jiān)聽器在運行時向scheduler注冊,并且不被存儲在jobs 和triggers的JobStore中。Jobs和Trigger只存儲了與他們相關的監(jiān)聽器的名字。因此,每次應用運行的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人商鋪長期租賃合同標的物詳細清單3篇
- 二零二五年度出租房屋消防安全設施改造施工合同4篇
- 二零二五年度假離婚法律風險評估及解決方案合同3篇
- 2025年度無人機租賃合同協(xié)議書8篇
- 2025版木工預制構件生產與安裝合同范本4篇
- 個人合同擔保書(2024年樣本):教育貸款擔保2篇
- 2025年個人挖機租賃合同續(xù)簽協(xié)議4篇
- 2025年度個人委托醫(yī)療健康產業(yè)投資管理協(xié)議2篇
- 2025年門窗行業(yè)產業(yè)扶貧合作協(xié)議3篇
- 二零二五年度廠房拆除工程安全防護及應急預案協(xié)議3篇
- 2025水利云播五大員考試題庫(含答案)
- 老年髖部骨折患者圍術期下肢深靜脈血栓基礎預防專家共識(2024版)解讀
- 中藥飲片驗收培訓
- 手術室??谱o士工作總結匯報
- DB34T 1831-2013 油菜收獲與秸稈粉碎機械化聯(lián)合作業(yè)技術規(guī)范
- 創(chuàng)傷處理理論知識考核試題及答案
- 肝素誘導的血小板減少癥培訓課件
- 抖音認證承諾函
- 高等數(shù)學(第二版)
- 四合一體系基礎知識培訓課件
- ICD-9-CM-3手術與操作國家臨床版亞目表
評論
0/150
提交評論