当前位置:文档之家› 详细讲解Quartz如何从入门到精通

详细讲解Quartz如何从入门到精通

详细讲解Quartz如何从入门到精通(1)Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE 和J2EE应用中。

它提供了巨大的灵活性而不牺牲简单性。

你能够用它来为执行一个作业而创建简单的或复杂的调度。

它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron-like表达式等等。

本文内容1、Quartz让任务调度简单2、Quartz的发展史3、上手Quartz4、Quartz内部架构5、作业6、作业管理和存储7、有效作业存储8、作业和触发器9、调度一个作业10、用调度器(Scheduler)调用你的作业11、编程调度同声明性调度12、有状态和无状态作业13、Quartz框架的其他特征14、Quartz下一步计划15、了解更多Quartz特征你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。

一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用 Java编程吗?如果这些问题中任何一个你回答是,那么你应该使用Quartz调度器。

旁注:Matrix目前就大量使用到了Quartz。

比如,排名统计功能的实现,在Jmatrix 里通过Quartz定义了一个定时调度作业,在每天凌晨一点,作业开始工作,重新统计大家的Karma和排名等。

还有,RSS文件的生成,也是通过Quartz定义作业,每隔半个小时生成一次RSS XML 文件。

所以Quartz使用的地方很多,本文无疑是一篇很好的入门和进阶的文章,在此,感谢David w Johnson的努力!Quartz让作业调度简单在你的Job接口实现类里面,添加一些逻辑到execute()方法。

一旦你配置好Job 实现类并设定好调度时间表,Quartz将密切注意剩余时间。

当调度程序确定该是通知你的作业的时候,Quartz框架将调用你Job实现类(作业类)上的 execute()方法并允许做它该做的事情。

无需报告任何东西给调度器或调用任何特定的东西。

仅仅执行任务和结束任务即可。

如果配置你的作业在随后再次被调用,Quartz框架将在恰当的时间再次调用它。

如果你使用了其它流行的开源框架象struts,你会对Quartz的设计和部件感到舒适。

虽然两个开源工程是解决完全不同的问题,还是有很多相似的之处,就是开源软件用户每天感觉很舒适。

Quartz能用在单机J2SE应用中,作为一个RMI服务器,也可以用在web应用中,甚至也可以用在J2EE应用服务器中。

Quartz的发展史尽管Quartz今年开始受到人们注意,但还是暂时流行。

Quartz由James House 创建并最初于2001年春天被加入sourceforge工程。

接下来的几年里,有许多新特征和版本出现,但是直到项目迁移到新的站点并成为 OpenSymphony项目家族的一员,才开始真正启动并受到应有的关注。

James House仍然和几个协助他的业余开发者参与大量开发工作。

Quartz开发团队今年能发布几个新版本,包括当前正处在候选发布阶段的1.5版。

上手QuartzQuartz工程驻留在OpenSymphony站点上。

在Quartz站点上可以找到许多有用的资源:JavaDocs,包含指南的文档,CVS访问,用户和开发者论坛的连接,当然也有下载。

从下载连接取得Quartz的发布版本,并且解压到到本地目录。

这个下载文件包含了一个预先构建好的Quartz二进制文件(quartz.jar),你可以将它放进自己的应用中。

Quartz框架只需要少数的第三方库,并且这些三方库是必需的,你很可能已经在使用这些库了。

你要把Quartz的安装目录的/lib/core 和 /lib/optional目录中的第三方库加进你自己的工程中。

大多数第三方库是我们所熟知和喜欢的标准Jakarta Commons库,像Commons Logging, Commons BeantUtils等等。

quartz.properties文件Quartz有一个叫做quartz.properties的配置文件,它允许你修改框架运行时环境。

缺省是使用Quartz.jar里面的quartz.properties文件。

当然,你应该创建一个quartz.properties文件的副本并且把它放入你工程的classes目录中以便类装载器找到它。

quartz.properties样本文件如例1所示。

一旦将Quartz.jar文件和第三方库加到自己的工程里面并且quartz.properties 文件在工程的classes目录中,就可以创建作业了。

然而,在做这之前,我们暂且回避一下先简短讨论一下Quartz架构。

Quartz内部架构在规模方面,Quartz跟大多数开源框架类似。

大约有300个Java类和接口,并被组织到12个包中。

这可以和Apache Struts把大约325个类和接口以及组织到11个包中相比。

尽管规模几乎不会用来作为衡量框架质量的一个特性,但这里的关键是quarts内含很多功能,这些功能和特性集是否成为、或者应该成为评判一个开源或非开源框架质量的因素。

Quartz调度器Quartz框架的核心是调度器。

调度器负责管理Quartz应用运行时环境。

调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。

Quartz不仅仅是线程和线程管理。

为确保可伸缩性,Quartz采用了基于多线程的架构。

启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。

这就是Quartz怎样能并发运行多个作业的原理。

Quartz依赖一套松耦合的线程池管理部件来管理线程环境。

本文中,我们会多次提到线程池管理,但 Quartz里面的每个对象是可配置的或者是可定制的。

所以,例如,如果你想要插进自己线程池管理设施,我猜你一定能!作业用Quartz的行话讲,作业是一个执行任务的简单Java类Job接口包含唯一的一个方法execute(),作业从这里开始执行。

一旦实现了Job 接口和execute()方法,当Quartz确定该是作业运行的时候,它将调用你的作业。

Execute()方法内就完全是你要做的事情。

下面有一些你要在作业里面做事情的例子:· 用JavaMail(或者用其他的像Commons Net一样的邮件框架)发送邮件· 创建远程接口并且调用在EJB上的方法· 获取Hibernate Session,查询和更新关系数据库里的数据· 使用OSWorkflow并且从作业调用一个工作流· 使用FTP和到处移动文件· 调用Ant构建脚本开始预定构建这种可能性是无穷的,正事这种无限可能性使得框架功能如此强大。

Quartz给你提供了一个机制来建立具有不同粒度的、可重复的调度表,于是,你只需创建一个Java 类,这个类被调用而执行任务。

作业管理和存储作业一旦被调度,调度器需要记住并且跟踪作业和它们的执行次数。

如果你的作业是30 分钟后或每30秒调用,这不是很有用。

事实上,作业执行需要非常准确和即·时调用在被调度作业上的execute()方法。

Quartz通过一个称之为作业存储(JobStore)的概念来做作业存储和管理。

有效作业存储Quartz提供两种基本作业存储类型。

第一种类型叫做RAMJobStore,它利用通常的内存来持久化调度程序信息。

这种作业存储类型最容易配置、构造和运行。

对许多应用来说,这种作业存储已经足够了。

然而,因为调度程序信息是存储在被分配给JVM的内存里面,所以,当应用程序停止运行时,所有调度信息将被丢失。

如果你需要在重新启动之间持久化调度信息,则将需要第二种类型的作业存储。

第二种类型的作业存储实际上提供两种不同的实现,但两种实现一般都称为JDBC 作业存储。

两种JDBC作业存储都需要JDBC驱动程序和后台数据库来持久化调度程序信息。

这两种类型的不同在于你是否想要控制数据库事务或这释放控制给应用服务器例如BEA's WebLogic或Jboss。

(这类似于J2EE领域中,Bean管理的事务和和容器管理事务之间的区别)这两种JDBC作业存储是:· JobStoreTX:当你想要控制事务或工作在非应用服务器环境中是使用· JobStoreCMT:当你工作在应用服务器环境中和想要容器控制事务时使用。

JDBC作业存储为需要调度程序维护调度信息的用户而设计。

作业和触发器Quartz设计者做了一个设计选择来从调度分离开作业。

Quartz中的触发器用来告诉调度程序作业什么时候触发。

框架提供了一把触发器类型,但两个最常用的是SimpleTrigger和CronTrigger。

SimpleTrigger为需要简单打火调度而设计。

典型地,如果你需要在给定的时间和重复次数或者两次打火之间等待的秒数打火一个作业,那么SimpleTrigger适合你。

另一方面,如果你有许多复杂的作业调度,那么或许需要CronTrigger。

CronTrigger是基于Calendar-like调度的。

当你需要在除星期六和星期天外的每天上午10点半执行作业时,那么应该使用CronTrigger。

正如它的名字所暗示的那样,CronTrigger是基于Unix克隆表达式的。

作为一个例子,下面的Quartz克隆表达式将在星期一到星期五的每天上午10点15分执行一个作业。

下面的表达式将在2002年到2005年的每个月的最后一个星期五上午10点15分执行作业。

你不可能用SimpleTrigger来做这些事情。

你可以用两者之中的任何一个,但哪个跟合适则取决于你的调度需要。

调度一个作业让我们通过看一个例子来进入实际讨论。

现假定你管理一个部门,无论何时候客户在它的FTP服务器上存储一个文件,都得用电子邮件通知它。

我们的作业将用FTP 登陆到远程服务器并下载所有找到的文件。

然后,它将发送一封含有找到和下载的文件数量的电子邮件。

这个作业很容易就帮助人们整天从手工执行这个任务中解脱出来,甚至连晚上都无须考虑。

我们可以设置作业循环不断地每60秒检查一次,而且工作在7×24模式下。

这就是Quartz框架完全的用途。

例2.从FTP站点下载文件和发送email的Quartz作业我们故意让ScanFTPSiteJob保持很简单。

我们为这个例子创建了一个叫做JobUtil的实用类。

它不是Quartz的组成部分,但对构建各种作业能重用的实用程序库来说是有意义的。

我们可以轻易将那种代码组织进作业类中,quarts 调度器一样好用,因为我们一直在使用quarts,所以那些代码可继续重用。

相关主题