参考《Prentice.Hall.PTR.Quartz.Job.Scheduling.Framework.Building.Open.Source.Enterprise.Applications.Jun.2006》以及quartz发行包带的例子写的一篇关于quartz的使用小文。
Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2SE和J2EE应用中。你能够用它来为执行一个作业而创建简单的或复杂的调度。比如:每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行,或者在某人离开本站后给他发Email等等。
Quartz项目的官方网站:http://www.opensymphony.com/quartz/
目前发布的版本为1.6.0
其运行要求JDK版本1.4.0以上,以及第三方库的支持:
J2EE.jar
Commons-beanutils.jar
Commons-collections-3.1.jar
Commons-dbcp-1.2.1.jar
Commons-digester-1.7.jar
Commons-logging.jar
Commons-logging-api.jar
Commons-modeler-1.1.jar
Commons-pool-1.2.jar
Commons-validator-1.1.4.jar
Quartz定义了很多包很多类其规模不小。Quartz任务调度主要由三个部件组成:scheduler、Trigger、JobDetail。
Quartz的接口类图如下:
Scheduler是quartz的核心,管理所有任务。它通过SchedulerFactory单态实例工厂产生。Scheduler在Start之后做下列任务:保存Job,保存Trigger,触发任务,查看未点火的任务(Misfire Trigger),删除不可能触发的任务等。
Trigger顾名思义为触发器 scheduler就是通过它来触发任务。它有几个分类常用的有SimpleTrigger 和CronTrigger。SimpleTrigger也就是简单触发器,用来触发周期性任务比如每多少多少时间触发一次。它可以指定StartTime 也就是设置从什么时候开始触发。
CronTrigger就是用Cron表达式来定义触发时间的触发器。Cron表达式从Unix克隆表达式的进化过来的。其形式相对其表达的意思来说很简单。
比如 0 0 0/2 * 3 6L * 的意思是 3月份的最后一个星期的星期五每两小时触发一次
就这样你可以设定论何时间。
JobDetail包含了任务的具体信息包括任务名称,任务所在的组,任务执行的类,还可以设置任务的一些参数。任务执行的类就是你想让任务要作的事情可以是论何事情打印一行HelloWorld,计算一下执行时间,统计一下访问人数,数据库操作等等,但是必须要实现Quartz的Job接口。Job接口很简单就一个方法public void execute(JobExecutionContext context)在这个方法里面写入你要做的事。JobExecutionContext包含了任务执行的一些环境你可以通过它得到很多东西JobDetai Trigger Schedule等等。
下面就用一个简单的例子来说明Quartz是怎么用的:
首先要有一个实现了Job接口的类 我们让它输出HelloWorld
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloJob implements Job {
private static Log _log=LogFactory.getLog(HelloJob.class);
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
_log.debug("Hello world!-"+new Date());
}
}
然后生成Scheduler实例定义JobDetail Trigger来调度它
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.JobListener;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
public class SimpleExample {
public void run()throws Exception{
Log log=LogFactory.getLog(SimpleExample.class);
log.info("------- Initializing ----------------------");
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
log.info("------- Initialization Complete -----------");
log.info("------- Scheduling Jobs -------------------");
JobDetail job = new JobDetail("myJob2", "group1", HelloJob.class);
CronTrigger trigger=new CronTrigger("MyTrigger2","group1","myJob2","group1");
trigger.setCronExpression("0/20 * * * * ?");
sched.scheduleJob(job, trigger);
sched.start();
log.info("------- Started Scheduler -----------------");
log.info("------- Waiting 90 seconds -------------");
try {
// wait 90 seconds to show jobs
Thread.sleep(90L * 1000L);
// executing
} catch (Exception e) {
}
// shut down the scheduler
log.info("------- Shutting Down ---------------------");
sched.shutdown(true);
log.info("------- Shutdown Complete -----------------");
}
public static void main(String[] args) throws Exception {
SimpleExample example = new SimpleExample();
example.run();
}
}
就这样运行一下quartz就能调度我们定义的HelloJob的任务了。可以看到我们先获得一个SchedulerFactory实例产生一个Scheduler实例,然后定义了一个JobDetail :JobDetail job = new JobDetail("myJob2", "group1", HelloJob.class);
将他与HelloJob绑定。定义了一个Trigger
CronTrigger trigger=new
CronTrigger("MyTrigger2","group1","myJob2","group1");
然后设置其Cron表达式:
trigger.setCronExpression("0/20 * * * * ?");
意思是每20秒执行一次
最后将他们加入到scheduler中sched.scheduleJob(job, trigger);
然后启动schedule:sched.start();
这样我们就可以看到日志中输出的HelloWorld和它的执行时间了。
上面讲的是他们最根本的应用,当然Quartz还有很多东西。
比如Listener JobStore 等等。
posted on 2006-11-24 10:19
渔人 阅读(448)
评论(0) 编辑 收藏