2024年-Quartz(入門詳解)參考幻燈片_第1頁
2024年-Quartz(入門詳解)參考幻燈片_第2頁
2024年-Quartz(入門詳解)參考幻燈片_第3頁
2024年-Quartz(入門詳解)參考幻燈片_第4頁
2024年-Quartz(入門詳解)參考幻燈片_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Quartz是什么?Quartz是一個(gè)作業(yè)調(diào)度系統(tǒng)(ajobschedulingsystem),Quartz不但可以集成到其他的軟件系統(tǒng)中,而且也可以獨(dú)立運(yùn)行的。12Quartz是什么?Quartz是OpenSymphony開源組織在Jobscheduling領(lǐng)域又一個(gè)開源項(xiàng)目,它可以與J2EE與J2SE應(yīng)用程序相結(jié)合也可以單獨(dú)使用。Quartz可以用來創(chuàng)建簡(jiǎn)單或?yàn)檫\(yùn)行十個(gè),百個(gè),甚至是好幾萬個(gè)Jobs這樣復(fù)雜的日程序表。Jobs可以做成標(biāo)準(zhǔn)的Java組件或EJBs。Quartz是一個(gè)任務(wù)日程管理系統(tǒng),一個(gè)在預(yù)先確定(被納入日程)的時(shí)間到達(dá)時(shí),負(fù)責(zé)執(zhí)行(或者通知)其他軟件組件的系統(tǒng)。Quartz用一個(gè)小Java庫發(fā)布文件(.jar文件),這個(gè)庫文件包含了所有Quartz核心功能。這些功能的主要接口(API)是Scheduler接口。它提供了簡(jiǎn)單的操作,例如:將任務(wù)納入日程或者從日程中取消,開始/停止/暫停日程進(jìn)度。22024/5/14怎么使用Quartz?//創(chuàng)建一個(gè)SchedulerFactory類的實(shí)例SchedulerFactoryschedFact=neworg.quartz.impl.StdSchedulerFactory();//創(chuàng)建一個(gè)Scheduler類的實(shí)例

Schedulersched=schedFact.getScheduler();//啟動(dòng)上面創(chuàng)建的Schedulersched.start();//創(chuàng)建一個(gè)JobDetailJobDetailjobDetail=newJobDetail("myJob",sched.DEFAULT_GROUP,DumbJob.class);//創(chuàng)建一個(gè)SimpleTriggerSimpleTriggertrigger=newSimpleTrigger("myTrigger",sched.DEFAULT_GROUP,newDate(),null,00L);//把JobDetail和SimpleTrigger所創(chuàng)建的各自實(shí)例關(guān)聯(lián)到一個(gè)Scheduler中sched.scheduleJob(jobDetail,trigger);32024/5/14Cron表達(dá)式(CronExpressions)

子表達(dá)式允許的值允許的特殊字符Seconds0-59-*/Minutes0-59-*/Hours0-23-*/Day-of-Month1-31-*?/LWMonth1-12或JAN-DEC-*/Day-of-Week1-7或SUN-SAT-*?/L#Years(Optional)為空或1970-2099-*/42024/5/14Easyexample//FirstwemustgetareferencetoaschedulerSchedulerFactorysf=newStdSchedulerFactory();Schedulersched=sf.getScheduler();//computeratimethatisonthenextroundminuteDaterunTime=TriggerUtils.getEvenMinuteDate(newDate());

//definethejobandtieittoourHelloJobclassJobDetailjob=newJobDetail("job1","group1",HelloJob.class);//TriggerthejobtorunonthenextroundminuteTriggertrigger=newSimpleTrigger("trigger1","group1",runTime);//Tellquartztoschedulethejobusingourtriggersched.scheduleJob(job,trigger);//Startuptheschedulersched.start();52024/5/14Spring中使用Quartz進(jìn)行作業(yè)調(diào)度Spring提供了支持時(shí)序調(diào)度(Scheduling)的整合類.現(xiàn)在,時(shí)序調(diào)度器通過FactoryBean建立,保持著可選的對(duì)Timers或者Triggers的引用。更進(jìn)一步的,對(duì)于QuartzScheduler和Timer兩者存在一個(gè)方便的類允許我們調(diào)用目標(biāo)對(duì)象(類似于通常的MethodInvokingFactoryBeans)上的某個(gè)方法。使用JobDetailBeanJobDetail

對(duì)象包括了運(yùn)行一個(gè)job所需要的所有信息。于是Spring提供了一個(gè)所謂的JobDetailBean使得JobDetail擁有了一個(gè)真實(shí)的,有意義的默認(rèn)值。讓我們來看個(gè)例子:<beanname="exampleJob"class="org.springframework.scheduling.quartz.JobDetailBean"><propertyname="jobClass"><value>example.ExampleJob</value></property><propertyname="jobDataAsMap"><map><entrykey="timeout"><value>5</value></entry></map></property></bean>62024/5/14Jobdetailbean擁有所有運(yùn)行job(ExampleJob)的必要信息。通過job的datamap來制定timeout。Job的datamap可以通過JobExecutionContext(在運(yùn)行時(shí)刻傳遞給你)來得到,但是JobDetailBean也把從job的datamap中得到的屬性映射到實(shí)際job中的屬性中去。所以,如果ExampleJob中包含一個(gè)名為timeout的屬性,JobDetailBean將自動(dòng)為它賦值:packageexample;

publicclassExampleJobextendsQuartzJobBean{

privateinttimeout;

/***SettercalledaftertheExampleJobisinstantiated*withthevaluefromtheJobDetailBean(5)*/publicvoidsetTimeout(inttimeout){this.timeout=timeout;}protectedvoidexecuteInternal(JobExecutionContextctx)throwsJobExecutionException{//dotheactualwork}}所有Jobdetailbean中的一些其他的設(shè)定對(duì)你來說也是可以同樣設(shè)置的.注意:使用name和group屬性,你可以修改job在哪一個(gè)組下運(yùn)行和使用什么名稱。默認(rèn)情況下,job的名稱等于jobdetaibean的名稱(在上面的例子中為exampleJob)。72024/5/14使用MethodInvokingJobDetailFactoryBean通常情況下,你只需要調(diào)用特定對(duì)象上的一個(gè)方法。你可以使用MethodInvokingJobDetailFactoryBean準(zhǔn)確的做到這一點(diǎn):<beanid="methodInvokingJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><propertyname="targetObject"><refbean="exampleBusinessObject"/></property><propertyname="targetMethod"><value>doIt</value></property></bean>上面例子將導(dǎo)致exampleBusinessObject中的doIt方法被調(diào)用(如下):publicclassBusinessObject{

//propertiesandcollaborators

publicvoiddoIt(){//dotheactualwork}}

<beanid="exampleBusinessObject"class="examples.ExampleBusinessObject"/>使用MethodInvokingJobDetailFactoryBean你不需要?jiǎng)?chuàng)建只有一行代碼且只調(diào)用一個(gè)方法的job,你只需要?jiǎng)?chuàng)建真實(shí)的業(yè)務(wù)對(duì)象來包裝具體的細(xì)節(jié)的對(duì)象。

82024/5/14默認(rèn)情況下,QuartzJobs是無狀態(tài)的,可能導(dǎo)致jobs之間互相的影響。如果你為相同的JobDetail指定兩個(gè)觸發(fā)器,很可能當(dāng)?shù)谝粋€(gè)job完成之前,第二個(gè)job就開始了。如果JobDetail對(duì)象實(shí)現(xiàn)了Stateful接口,就不會(huì)發(fā)生這樣的事情。第二個(gè)job將不會(huì)在第一個(gè)job完成之前開始。為了使得jobs不并發(fā)運(yùn)行,設(shè)置MethodInvokingJobDetailFactoryBean中的concurrent標(biāo)記為false。<beanid="methodInvokingJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><propertyname="targetObject"><refbean="exampleBusinessObject"/></property><propertyname="targetMethod"><value>doIt</value></property></bean> 注意:默認(rèn)情況下,jobs在并行的方式下運(yùn)行。92024/5/14使用triggers和SchedulerFactoryBean來包裝任務(wù)我們已經(jīng)創(chuàng)建了jobdetails,jobs。我們回顧了允許你調(diào)用特定對(duì)象上某一個(gè)方法的便捷的bean。當(dāng)然我們?nèi)孕枰{(diào)度這些jobs。這需要使用triggers和SchedulerFactoryBean來完成。Quartz自帶一些可供使用的triggers。Spring提供兩個(gè)子類triggers,分別為CronTriggerBean和SimpleTriggerBean。

Triggers也需要被調(diào)度。Spring提供SchedulerFactoryBean來暴露一些屬性來設(shè)置triggers。SchedulerFactoryBean負(fù)責(zé)調(diào)度那些實(shí)際的triggers。

兩個(gè)例子:102024/5/14<beanid="simpleTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean"><propertyname="jobDetail"><!--seetheexampleofmethodinvokingjobabove--><refbean="methodInvokingJobDetail"/></property><propertyname="startDelay"><!--10seconds--><value>10000</value></property><propertyname="repeatInterval"><!--repeatevery50seconds--><value>50000</value></property></bean>

<beanid="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean"><propertyname="jobDetail"><refbean="exampleJob"/></property><propertyname="cronExpression"><!--runeverymorningat6am--><value>06**1</value></property></bean>112024/5/14現(xiàn)在我們創(chuàng)建了兩個(gè)triggers,其中一個(gè)開始延遲10秒以后每50秒運(yùn)行一次,另一個(gè)每天早上6點(diǎn)鐘運(yùn)行。我們需要?jiǎng)?chuàng)建一個(gè)SchedulerFactoryBean來最終實(shí)現(xiàn)上述的一切:beanclass="org.springframework.scheduling.quartz.SchedulerFactoryBean"><propertyname="triggers"><list><reflocal="cronTrigger"/><reflocal="simpleTrigger"/></list></property></bean>122024/5/14Quartz框架分析核心接口SchedulerJobJobDetailTriggerJobDataMap132024/5/14Job作業(yè)是一個(gè)執(zhí)行任務(wù)的簡(jiǎn)單java類。任務(wù)可以是任何java代碼。只需你實(shí)現(xiàn)org.quartz.Job接口。當(dāng)Quartz確定該是作業(yè)運(yùn)行的時(shí)候,它將調(diào)用你的作業(yè)。Quartz提供了一個(gè)機(jī)制來建立具有不同粒度的、可重復(fù)的調(diào)度表,于是,你只需創(chuàng)建一個(gè)java類,這個(gè)類被調(diào)用而執(zhí)行任務(wù)。

publicinterfaceJob{ voidexecute(JobExecutionContextcontext)throws JobExecutionException; }142024/5/14JobDetailJobDetail對(duì)象由Quartz客戶端在Job被加入到scheduler時(shí)創(chuàng)建。它包含了Job的各種設(shè)置屬性以及一個(gè)JobDataMap對(duì)象,這個(gè)對(duì)象被用來存儲(chǔ)給定Job類實(shí)例的狀態(tài)信息。Scheduler并不保存真正的JobClass,而是通過JobDetail來保存。注意,我們給scheduler傳入了一個(gè)JobDetail實(shí)例,而且這個(gè)JobDetail實(shí)例只是簡(jiǎn)單提供了類名來引用被執(zhí)行的Job。每次scheduler執(zhí)行這個(gè)任務(wù)時(shí),它就創(chuàng)建這個(gè)類的新實(shí)例,然后調(diào)用該實(shí)例的execute(..)方法。Job不必?fù)?dān)心線程安全性,因?yàn)橥粫r(shí)刻僅有一個(gè)線程去執(zhí)行給定Job類的實(shí)例,甚至是并發(fā)執(zhí)行同一Job也是如此。推斷:Job類必須有一個(gè)無參數(shù)的構(gòu)造函數(shù)Job類中定義的成員數(shù)據(jù)失去意義,因?yàn)檫@些成員數(shù)據(jù)值在每次執(zhí)行的時(shí)候被“清空”了。152024/5/14JobFactoryJobFactory控制job的實(shí)例化JobnewJob(TriggerFiredBundlebundle)throws SchedulerException;默認(rèn)的JobFactory是org.quartz.simpl.SimpleJobFactory,缺省的JobFactory只是簡(jiǎn)單地對(duì)Job類調(diào)用newInstance()方法。設(shè)置JobFactory:Scheduler.setJobFactory(factory)配置perties的org.quartz.scheduler.jobFactory.class屬性設(shè)置jobFactory的類型162024/5/14JobDataMapJobDataMap被用來保存一系列的(序列化的)對(duì)象,這些對(duì)象在Job執(zhí)行時(shí)可以得到。JobDataMap是JavaMap接口的一個(gè)實(shí)現(xiàn),而且還增加了一些存儲(chǔ)和讀取主類型數(shù)據(jù)的便捷方法。JobDetail.getJobDataMap().put("jobSays","HelloWorld!");JobExecutionContext.getJobDetail().getJobDataMap();Trigger.getJobDataMap();JobExecutionContext.getMergedJobDataMap();172024/5/14StatefulJob有狀態(tài)任務(wù)任務(wù)在執(zhí)行任務(wù)過程中,任何對(duì)JobDataMap所作的更改都將丟失而且任務(wù)下次執(zhí)行時(shí)也無法看到。StatefulJob在任務(wù)的每次執(zhí)行之后重新存儲(chǔ)JobDataMapJobvs.StatefulJobJobDataMap在每次執(zhí)行之后重新持久化到JobStore中。兩個(gè)或多個(gè)有狀態(tài)的JobDetail實(shí)例不能并發(fā)執(zhí)行。182024/5/14TriggerTrigger對(duì)象被用來觸發(fā)jobs的執(zhí)行。你希望將任務(wù)納入到進(jìn)度,要實(shí)例化一個(gè)Trigger并且“調(diào)整”它的屬性以滿足你想要的進(jìn)度安排。Triggers也有一個(gè)JobDataMap與之關(guān)聯(lián),這非常有利于向觸發(fā)器所觸發(fā)的Job傳遞參數(shù)。Quartz打包了很多不同類型的Trigger,但最常用的Trigger類是SimpleTrigger和CronTrigger。192024/5/14SimpleTriggerSimpleTrigger用來觸發(fā)只需執(zhí)行一次或者在給定時(shí)間觸發(fā)并且重復(fù)N次且每次執(zhí)行延遲一定時(shí)間的任務(wù)。如果你想讓觸發(fā)器在2010年1月11日,上午11:23:54秒執(zhí)行,然后每個(gè)隔10秒鐘重復(fù)執(zhí)行一次,并且這樣重復(fù)5次。那么SimpleTrigger就可以滿足你的要求。publicSimpleTrigger(Stringname,Stringgroup,StringjobName,StringjobGroup,DatestartTime,DateendTime,intrepeatCount,longrepeatInterval);202024/5/14CronTrigger如果你需要像日歷那樣按日程來觸發(fā)任務(wù),而不是像SimpleTrigger那樣每隔特定的間隔時(shí)間觸發(fā),CronTriggers通常比SimpleTrigger更有用。使用CronTrigger,你可以指定諸如“每個(gè)周五中午”,或者“每個(gè)工作日的9:30”或者“從每個(gè)周一、周三、周五的上午9:00到上午10:00之間每隔五分鐘”這樣日程安排來觸發(fā)。甚至,象SimpleTrigger一樣,CronTrigger也有一個(gè)startTime以指定日程從什么時(shí)候開始,也有一個(gè)(可選的)endTime以指定何時(shí)日程不再繼續(xù)。publicCronTrigger(Stringname,Stringgroup,StringjobName, StringjobGroup,DatestartTime,DateendTime,String cronExpression,TimeZonetimeZone)throwsParseException;212024/5/14CronExpressionsCron表達(dá)式被用來配置CronTrigger實(shí)例。Cron表達(dá)式是一個(gè)由7個(gè)子表達(dá)式組成的字符串。每個(gè)子表達(dá)式都描述了一個(gè)單獨(dú)的日程細(xì)節(jié)。這些子表達(dá)式用空格分隔,分別表示:Seconds秒Minutes分鐘Hours小時(shí)Day-of-Month月中的天Month月Day-of-Week周中的天Year(optionalfield)年222024/5/14TriggerUtilsTriggerUtils提供了許多便捷的方法簡(jiǎn)化了構(gòu)造和配置trigger。publicstaticTriggermakeSecondlyTrigger(intintervalInSeconds);publicstaticTriggermakeDailyTrigger(inthour,intminute);publicstaticTriggermakeWeeklyTrigger(intdayOfWeek,inthour, intminute);publicstaticTriggermakeMonthlyTrigger(intdayOfMonth,int hour,intminute);publicstaticDategetNextGivenMinuteDate(Datedate,int minuteBase);publicstaticDategetEvenMinuteDate(Datedate);232024/5/14JobStore作業(yè)存儲(chǔ)Quartz提供兩種基本作業(yè)存儲(chǔ)類型。第一種類型叫做RAMJobStore,它利用通常的內(nèi)存來持久化調(diào)度程序信息。這種作業(yè)存儲(chǔ)類型最容易配置、構(gòu)造和運(yùn)行。對(duì)許多應(yīng)用來說,這種作業(yè)存儲(chǔ)已經(jīng)足夠了。然而,因?yàn)檎{(diào)度程序信息是存儲(chǔ)在被分配給JVM的內(nèi)存里面,所以,當(dāng)應(yīng)用程序停止運(yùn)行時(shí),所有調(diào)度信息將被丟失。如果你需要在重新啟動(dòng)之間持久化調(diào)度信息,則將需要第二種類型的作業(yè)存儲(chǔ)。第二種類型的作業(yè)存儲(chǔ)實(shí)際上提供兩種不同的實(shí)現(xiàn),但兩種實(shí)現(xiàn)一般都稱為JDBC作業(yè)存儲(chǔ)。兩種JDBC作業(yè)存儲(chǔ)都需要JDBC驅(qū)動(dòng)程序和后臺(tái)數(shù)據(jù)庫來持久化調(diào)度程序信息。這兩種類型的不同在于你是否想要控制數(shù)據(jù)庫事務(wù)或這釋放控制給應(yīng)用服務(wù)器例如BEA’sWebLogic或Jboss。org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.impl.jdbcjobstore.JobStoreCMT242024/5/14TriggerListeners和JobListeners監(jiān)聽器是在scheduler事件發(fā)生時(shí)能夠執(zhí)行動(dòng)作的對(duì)象??梢钥闯?,TriggerListeners接收與triggers相關(guān)的事件,而JobListeners則接收與Job相關(guān)的事件。創(chuàng)建監(jiān)聽器很簡(jiǎn)單,創(chuàng)建一個(gè)實(shí)現(xiàn)TriggerListener或JobListener的接口。監(jiān)聽器然后在執(zhí)行的時(shí)候注冊(cè)到scheduler中,而且必須給定一個(gè)名字(或者,它們必須通過他們的getName()方法來介紹自己)。監(jiān)聽器可以被注冊(cè)為“全局”的或者“非全局”。“全局”監(jiān)聽器接收所有triggers/jobs產(chǎn)生的事件,而“非全局”監(jiān)聽器只接受那些顯式指定監(jiān)聽器名的triggers/jobs所產(chǎn)生的事件。SchedulerListeners只接收與特定

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論