调度框架Quartz快速入门

来源:互联网 发布:笔记本散热器推荐 知乎 编辑:程序博客网 时间:2024/05/22 05:16

Quartz是功能非常强大的任务调度框架,下面用一个小例子说明如何使用。

    首先去Quartz官网下载http://www.opensymphony.com/quartz/ ,目前最新的版本式1.6.2,本文中使用的是1.6.1。把压缩包解压到本地,里面包含了quartz本身,文档,源代码和依赖的类包等。

eclipse中新建一个java工程,把quartzjar文件quartz-1.6.1.jar加入构建路径,同时quartz运行至少还需要另外两个类包:commons-collections-3.2.jar commons-logging-1.1.jar,这两个文件可以在lib/core目录下找到。

下面我们就可以开始编写类体验quartz的强大功能了。下面以一个简单的定时输出小任务为例,这个任务很简单,就是每隔一段时间输出一句话。

首先编写类PrintoutJob实现一个简单的输出任务。在Quartz框架里运行的任务叫做job,这个类需要实现Job接口,

public class PrintoutJob implements Job {

      @Override

       public void execute(JobExecutionContext ctx) throws JobExecutionException{

         System.out.println("do task...");

       }

}

任务现在已经有了,还需要一个让它运行起来的调度器—Scheduler。再新建一个类JobRunner

public class JobRunner {

public static void main(String[] args) {

   Scheduler scheduler = null;

      SchedulerFactory schFactory = new StdSchedulerFactory();

      try {

         scheduler = schFactory.getScheduler();

         JobDetail initjob = new JobDetail("printjob", "jobGroup", PrintoutJob.class);

         SimpleTrigger trig = new SimpleTrigger("trigger1", "jobGroup");

         Date runTime = TriggerUtils.getEvenSecondDate(new Date());

         trig.setStartTime(runTime);

         trig.setRepeatInterval(3000);

         trig.setRepeatCount(10);

         scheduler.scheduleJob(initjob, trig);

         scheduler.start();

} catch (SchedulerException e) {

e.printStackTrace();

     }

  }

}

要让Scheduler按照你的意图去调度自己的job,还需要告诉Schduler关于这个job的一些详细信息,job的详细信息保存在一个JobDetail的实例中,

new JobDetail("printjob", "jobGroup", PrintoutJob.class);

表示这个job的名字叫“printjob”,属于“jobGroup”线程组,job的实现类是PrintoutJob。有了job的详细信息,还要告诉调度器scheduler如何去做调度,即在什么时间,按照什么频率去执行job,提供这个信息的是一个trigger,我们先创建一个简单类型的trigger—SimpleTrigger,下面给trigger设置属性:

trig.setStartTime(runTime)——设置job开始运行的时间,这里是立刻开始,

trig.setRepeatInterval(3000)——设置运行间隔时间是3000毫秒即3秒,

trig.setRepeatCount(10)——设置job一共执行10次,

再把我们创建的JobDetailSimpleTrigger注册到shcduler:

scheduler.scheduleJob(initjob, trig)

调用start()方法启动schduler,前面写好的任务就按照我们的设定开始执行了。

SimpleTrigger可以为我们完成一些简单的调度功能,可是我们有时需要一些更复杂的调度,比如每月的某天允许,或每周几运行等等。Quartz也提供了一个完成这样复杂调度的triggerCronTriggerCronTrigger的功能非常强大,通过时间表达式可以完成很多复杂的调度,它的表达式和Linux下的cron一样。使用CronTrigger

CronTrigger jobTrigger = new CronTrigger("onlineTrigger", "triggerGroup");

CronExpression cexp = new CronExpression(0/5 * * * * ?);

jobTrigger.setCronExpression(cexp); 

需要注意的一点是,与使用Thread来实现定时调度不同的是,quartzjob既不需要继承Thread,也不需要实现Runnable接口,Job每次执行都是一个新的实例。

上面的例子代码显示,Job是被Scheduler调度运行的,那如果需要传递参数给Job,好像就没办法实现了,其实quartz给我们提供了一种给Job传递参数的办法,通过JobDetailDataMap,在主类中把要传递的数据放入DataMap中,比如我们要把一个参数类Config传递给Job

initjob.getJobDataMap().put("CONFIG", config);

Job获取传递的数据:

Config cfg = (Config)ctx.getJobDetail().getJobDataMap().get("CONFIG");