定时任务Java编写综述
目前我所用过的定时任务机制主要分三类:OS级的Linux crontab命令方式、Java语言级的JDK自带API、第三方API接口如Quartz(当然,其他MVC框架如Spring基于Quartz实现了更人性化的API接口,此类接口一并归入Quartz类族)。
这三种方式相比,OS级不用专门开启监听器,占用系统资源较少,是定时任务首选的实现方式;JDK自带API主要是Timer和TimeTask,这些API提供的接口功能简单,往往不能满足用户定时任务设置需要;Quartz是Java语言编写的API,其可以单独部署,也可以作为系统的模块嵌入既有代码中,通过开启监听触发定时任务的方式实现,相对而言,特别是用此种方式开辟大量监听很耗资源。
下面分别介绍这三种常用的定时任务实现方式。
3. 第三方API接口如Quartz
Quartz是一个任务日程管理系统,这个系统可以与任何其他软件系统集成或者一起使用。简而言之,“任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。
Quartz相当“轻量”,并且需要非常少的步骤/配置,如果需求比较基本,Quartz确实非常容易使用。
Quartz具有容错性,并且可以在你系统重起的时候持久化(记住)被纳入日程的任务。
3.1 Quartz功能简介
Quartz特点:
Quartz能嵌入到任何独立的应用中运行。
Quartz能在应用服务器或者Servlet容器中实例化,并且能够参与XA事务。
Quartz能够以独立的方式运行(在它自己的Java虚拟机中),可以通过RMI使用Quartz。
Quartz可以被实例化为独立程序的集群(有负载均衡和容错能力)
3.2 从软件组件的角度来看Quartz
Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。
如果你想将软件组件的执行纳入到日程中,它们只需简单地实现Job接口,这个接口有一个execute()方法。如果希望在日程安排的时间到达时通知组件,那么这些组件应实现TriggerListener或者JobListener接口。
Quartz主过程可以在应用中启动或者运行,也可以作为一个独立的应用(带有RMI接口),或者在一个J2EE 应用服务器中运行,并且可作为其它J2EE组件的一种引用资源。
3.3 为什么不使用java.util.Timer?
从JDK1.3开始,Java有了内建的定时器功能,即通过java.util.Timer和java.util.TimerTask来实现,为什么有人用Quartz而不用这些标准特性呢?有很多原因,下面是其中的一些:
1. Java定时器没有持久化机制。
2. Java定时器的日程管理不够灵活(只能设置开始时间、重复的间隔,设置特定的日期、时间等)
3. Java定时器没有使用线程池(每个Java定时器使用一个线程)
4. Java定时器没有切实的管理方案,你不得不自己完成存储、组织、恢复任务的措施。
一言以蔽之,这两个新类可以实现一个最基本的调度器。也就只能作为我们理想的完整调度器框架的一个小的部件。任何严格意义的作业调度器都提供直接指定执行时间,存储作业信息到多种介绍和使用钩子进行定制及其他更多的功能。单纯靠JDK的那两个类还不足以构建一个真正的作业调度器。JAVA的Timer类也没办法对作业和触发器作相应的组织,使用每任务一个线程,而不是线程池的方式,还有其他不足之处难以成全其实现一个完全意义的作业调度器。
流行的几个解决方案
Flux Scheduler:www.fluxcorp.com/
Enterprise Batching Queuing: www.argent.com/p/qe/qe.html
Unicenter AutoSys Job Management 4.5:www.ca.com
BMC Software ControlM: www.bmc.com
Cybermation ESP Espresso 4.2: www.cybermation.corly;9'm
Vexus consulting Avatar Job Scheduling Suite 4.5.5 :www.vexus.ca
Argent software The Argent Job Scheduler 4.5A :www.argent.com
Tidal Enterprise Scheduler: www.tidalsoftware.com