posts - 2,comments - 8,trackbacks - 0
参考《Prentice.Hall.PTR.Quartz.Job.Scheduling.Framework.Building.Open.Source.Enterprise.Applications.Jun.2006》以及quartz发行包带的例子写的一篇关于quartz的使用小文。

 

Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2SEJ2EE应用中。你能够用它来为执行一个作业而创建简单的或复杂的调度。比如:每天或每周星期二晚上1130,或许仅仅每个月的最后一天执行,或者在某人离开本站后给他发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定义了很多包很多类其规模不小。Quartz任务调度主要由三个部件组成:schedulerTriggerJobDetail

Quartz的接口类图如下:

 

 

1.1 schedulerTriggerJobDetail

Schedulerquartz的核心,管理所有任务。它通过SchedulerFactory单态实例工厂产生。SchedulerStart之后做下列任务:保存Job,保存Trigger,触发任务,查看未点火的任务(Misfire Trigger),删除不可能触发的任务等。

Trigger顾名思义为触发器 scheduler就是通过它来触发任务。它有几个分类常用的有SimpleTrigger CronTriggerSimpleTrigger也就是简单触发器,用来触发周期性任务比如每多少多少时间触发一次。它可以指定StartTime 也就是设置从什么时候开始触发。

CronTrigger就是用Cron表达式来定义触发时间的触发器。Cron表达式从Unix克隆表达式的进化过来的。其形式相对其表达的意思来说很简单。

比如 0 0 0/2 * 3 6L * 的意思是 3月份的最后一个星期的星期五每两小时触发一次

就这样你可以设定论何时间。

 

JobDetail包含了任务的具体信息包括任务名称,任务所在的组,任务执行的类,还可以设置任务的一些参数。任务执行的类就是你想让任务要作的事情可以是论何事情打印一行HelloWorld,计算一下执行时间,统计一下访问人数,数据库操作等等,但是必须要实现QuartzJob接口。Job接口很简单就一个方法public void execute(JobExecutionContext context)在这个方法里面写入你要做的事。JobExecutionContext包含了任务执行的一些环境你可以通过它得到很多东西JobDetai Trigger Schedule等等。

1.2 HelloWorld

下面就用一个简单的例子来说明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秒执行一次

最后将他们加入到schedulersched.scheduleJob(job, trigger);

然后启动schedulesched.start();

这样我们就可以看到日志中输出的HelloWorld和它的执行时间了。

 

上面讲的是他们最根本的应用,当然Quartz还有很多东西。

比如Listener JobStore 等等。

posted on 2006-11-24 10:19 渔人 阅读(448) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: