2024年-Quartz(入门详解)参考幻灯片_第1页
2024年-Quartz(入门详解)参考幻灯片_第2页
2024年-Quartz(入门详解)参考幻灯片_第3页
2024年-Quartz(入门详解)参考幻灯片_第4页
2024年-Quartz(入门详解)参考幻灯片_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Quartz是什么?Quartz是一个作业调度系统(ajobschedulingsystem),Quartz不但可以集成到其他的软件系统中,而且也可以独立运行的。12Quartz是什么?Quartz是OpenSymphony开源组织在Jobscheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或EJBs。Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。22024/5/14怎么使用Quartz?//创建一个SchedulerFactory类的实例SchedulerFactoryschedFact=neworg.quartz.impl.StdSchedulerFactory();//创建一个Scheduler类的实例

Schedulersched=schedFact.getScheduler();//启动上面创建的Schedulersched.start();//创建一个JobDetailJobDetailjobDetail=newJobDetail("myJob",sched.DEFAULT_GROUP,DumbJob.class);//创建一个SimpleTriggerSimpleTriggertrigger=newSimpleTrigger("myTrigger",sched.DEFAULT_GROUP,newDate(),null,00L);//把JobDetail和SimpleTrigger所创建的各自实例关联到一个Scheduler中sched.scheduleJob(jobDetail,trigger);32024/5/14Cron表达式(CronExpressions)

子表达式允许的值允许的特殊字符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进行作业调度Spring提供了支持时序调度(Scheduling)的整合类.现在,时序调度器通过FactoryBean建立,保持着可选的对Timers或者Triggers的引用。更进一步的,对于QuartzScheduler和Timer两者存在一个方便的类允许我们调用目标对象(类似于通常的MethodInvokingFactoryBeans)上的某个方法。使用JobDetailBeanJobDetail

对象包括了运行一个job所需要的所有信息。于是Spring提供了一个所谓的JobDetailBean使得JobDetail拥有了一个真实的,有意义的默认值。让我们来看个例子:<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拥有所有运行job(ExampleJob)的必要信息。通过job的datamap来制定timeout。Job的datamap可以通过JobExecutionContext(在运行时刻传递给你)来得到,但是JobDetailBean也把从job的datamap中得到的属性映射到实际job中的属性中去。所以,如果ExampleJob中包含一个名为timeout的属性,JobDetailBean将自动为它赋值:packageexample;

publicclassExampleJobextendsQuartzJobBean{

privateinttimeout;

/***SettercalledaftertheExampleJobisinstantiated*withthevaluefromtheJobDetailBean(5)*/publicvoidsetTimeout(inttimeout){this.timeout=timeout;}protectedvoidexecuteInternal(JobExecutionContextctx)throwsJobExecutionException{//dotheactualwork}}所有Jobdetailbean中的一些其他的设定对你来说也是可以同样设置的.注意:使用name和group属性,你可以修改job在哪一个组下运行和使用什么名称。默认情况下,job的名称等于jobdetaibean的名称(在上面的例子中为exampleJob)。72024/5/14使用MethodInvokingJobDetailFactoryBean通常情况下,你只需要调用特定对象上的一个方法。你可以使用MethodInvokingJobDetailFactoryBean准确的做到这一点:<beanid="methodInvokingJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><propertyname="targetObject"><refbean="exampleBusinessObject"/></property><propertyname="targetMethod"><value>doIt</value></property></bean>上面例子将导致exampleBusinessObject中的doIt方法被调用(如下):publicclassBusinessObject{

//propertiesandcollaborators

publicvoiddoIt(){//dotheactualwork}}

<beanid="exampleBusinessObject"class="examples.ExampleBusinessObject"/>使用MethodInvokingJobDetailFactoryBean你不需要创建只有一行代码且只调用一个方法的job,你只需要创建真实的业务对象来包装具体的细节的对象。

82024/5/14默认情况下,QuartzJobs是无状态的,可能导致jobs之间互相的影响。如果你为相同的JobDetail指定两个触发器,很可能当第一个job完成之前,第二个job就开始了。如果JobDetail对象实现了Stateful接口,就不会发生这样的事情。第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置MethodInvokingJobDetailFactoryBean中的concurrent标记为false。<beanid="methodInvokingJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><propertyname="targetObject"><refbean="exampleBusinessObject"/></property><propertyname="targetMethod"><value>doIt</value></property></bean> 注意:默认情况下,jobs在并行的方式下运行。92024/5/14使用triggers和SchedulerFactoryBean来包装任务我们已经创建了jobdetails,jobs。我们回顾了允许你调用特定对象上某一个方法的便捷的bean。当然我们仍需要调度这些jobs。这需要使用triggers和SchedulerFactoryBean来完成。Quartz自带一些可供使用的triggers。Spring提供两个子类triggers,分别为CronTriggerBean和SimpleTriggerBean。

Triggers也需要被调度。Spring提供SchedulerFactoryBean来暴露一些属性来设置triggers。SchedulerFactoryBean负责调度那些实际的triggers。

两个例子: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现在我们创建了两个triggers,其中一个开始延迟10秒以后每50秒运行一次,另一个每天早上6点钟运行。我们需要创建一个SchedulerFactoryBean来最终实现上述的一切:beanclass="org.springframework.scheduling.quartz.SchedulerFactoryBean"><propertyname="triggers"><list><reflocal="cronTrigger"/><reflocal="simpleTrigger"/></list></property></bean>122024/5/14Quartz框架分析核心接口SchedulerJobJobDetailTriggerJobDataMap132024/5/14Job作业是一个执行任务的简单java类。任务可以是任何java代码。只需你实现org.quartz.Job接口。当Quartz确定该是作业运行的时候,它将调用你的作业。Quartz提供了一个机制来建立具有不同粒度的、可重复的调度表,于是,你只需创建一个java类,这个类被调用而执行任务。

publicinterfaceJob{ voidexecute(JobExecutionContextcontext)throws JobExecutionException; }142024/5/14JobDetailJobDetail对象由Quartz客户端在Job被加入到scheduler时创建。它包含了Job的各种设置属性以及一个JobDataMap对象,这个对象被用来存储给定Job类实例的状态信息。Scheduler并不保存真正的JobClass,而是通过JobDetail来保存。注意,我们给scheduler传入了一个JobDetail实例,而且这个JobDetail实例只是简单提供了类名来引用被执行的Job。每次scheduler执行这个任务时,它就创建这个类的新实例,然后调用该实例的execute(..)方法。Job不必担心线程安全性,因为同一时刻仅有一个线程去执行给定Job类的实例,甚至是并发执行同一Job也是如此。推断:Job类必须有一个无参数的构造函数Job类中定义的成员数据失去意义,因为这些成员数据值在每次执行的时候被“清空”了。152024/5/14JobFactoryJobFactory控制job的实例化JobnewJob(TriggerFiredBundlebundle)throws SchedulerException;默认的JobFactory是org.quartz.simpl.SimpleJobFactory,缺省的JobFactory只是简单地对Job类调用newInstance()方法。设置JobFactory:Scheduler.setJobFactory(factory)配置perties的org.quartz.scheduler.jobFactory.class属性设置jobFactory的类型162024/5/14JobDataMapJobDataMap被用来保存一系列的(序列化的)对象,这些对象在Job执行时可以得到。JobDataMap是JavaMap接口的一个实现,而且还增加了一些存储和读取主类型数据的便捷方法。JobDetail.getJobDataMap().put("jobSays","HelloWorld!");JobExecutionContext.getJobDetail().getJobDataMap();Trigger.getJobDataMap();JobExecutionContext.getMergedJobDataMap();172024/5/14StatefulJob有状态任务任务在执行任务过程中,任何对JobDataMap所作的更改都将丢失而且任务下次执行时也无法看到。StatefulJob在任务的每次执行之后重新存储JobDataMapJobvs.StatefulJobJobDataMap在每次执行之后重新持久化到JobStore中。两个或多个有状态的JobDetail实例不能并发执行。182024/5/14TriggerTrigger对象被用来触发jobs的执行。你希望将任务纳入到进度,要实例化一个Trigger并且“调整”它的属性以满足你想要的进度安排。Triggers也有一个JobDataMap与之关联,这非常有利于向触发器所触发的Job传递参数。Quartz打包了很多不同类型的Trigger,但最常用的Trigger类是SimpleTrigger和CronTrigger。192024/5/14SimpleTriggerSimpleTrigger用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。如果你想让触发器在2010年1月11日,上午11:23:54秒执行,然后每个隔10秒钟重复执行一次,并且这样重复5次。那么SimpleTrigger就可以满足你的要求。publicSimpleTrigger(Stringname,Stringgroup,StringjobName,StringjobGroup,DatestartTime,DateendTime,intrepeatCount,longrepeatInterval);202024/5/14CronTrigger如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用。使用CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。甚至,象SimpleTrigger一样,CronTrigger也有一个startTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定何时日程不再继续。publicCronTrigger(Stringname,Stringgroup,StringjobName, StringjobGroup,DatestartTime,DateendTime,String cronExpression,TimeZonetimeZone)throwsParseException;212024/5/14CronExpressionsCron表达式被用来配置CronTrigger实例。Cron表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:Seconds秒Minutes分钟Hours小时Day-of-Month月中的天Month月Day-of-Week周中的天Year(optionalfield)年222024/5/14TriggerUtilsTriggerUtils提供了许多便捷的方法简化了构造和配置trigger。publicstaticTriggermakeSecondlyTrigger(intintervalInSeconds);publicstaticTriggermakeDailyTrigger(inthour,intminute);publicstaticTriggermakeWeeklyTrigger(intdayOfWeek,inthour, intminute);publicstaticTriggermakeMonthlyTrigger(intdayOfMonth,int hour,intminute);publicstaticDategetNextGivenMinuteDate(Datedate,int minuteBase);publicstaticDategetEvenMinuteDate(Datedate);232024/5/14JobStore作业存储Quartz提供两种基本作业存储类型。第一种类型叫做RAMJobStore,它利用通常的内存来持久化调度程序信息。这种作业存储类型最容易配置、构造和运行。对许多应用来说,这种作业存储已经足够了。然而,因为调度程序信息是存储在被分配给JVM的内存里面,所以,当应用程序停止运行时,所有调度信息将被丢失。如果你需要在重新启动之间持久化调度信息,则将需要第二种类型的作业存储。第二种类型的作业存储实际上提供两种不同的实现,但两种实现一般都称为JDBC作业存储。两种JDBC作业存储都需要JDBC驱动程序和后台数据库来持久化调度程序信息。这两种类型的不同在于你是否想要控制数据库事务或这释放控制给应用服务器例如BEA’sWebLogic或Jboss。org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.impl.jdbcjobstore.JobStoreCMT242024/5/14TriggerListeners和JobListeners监听器是在scheduler事件发生时能够执行动作的对象。可以看出,TriggerListeners接收与triggers相关的事件,而JobListeners则接收与Job相关的事件。创建监听器很简单,创建一个实现TriggerListener或JobListener的接口。监听器然后在执行的时候注册到scheduler中,而且必须给定一个名字(或者,它们必须通过他们的getName()方法来介绍自己)。监听器可以被注册为“全局”的或者“非全局”。“全局”监听器接收所有triggers/jobs产生的事件,而“非全局”监听器只接受那些显式指定监听器名的triggers/jobs所产生的事件。SchedulerListeners只接收与特定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论