Quartz 是一个功能强大的作业调度工具。

      日程安排好了之后,我们就要去执行,Quartz可以计划的执行这些任务,定时、循环或在某一个时间来执行我们需要做的事,用到Quartz可以很好的解决我们平时工作中的琐碎麻烦的事:比如,数据库系统需要我们每天23:50的时候需要执行一次备份,每月的15号需要将公司账目平台里的工资表导出……有了Quartz可以很好的来解决这些问题,不需要我们手动来执行。

Quartz官网:http://quartz-scheduler.org/ 可以在这里下载Quartz,也可以到我共享的资源里下载,免分的,请点击这里-》http://down.51cto.com/data/426993

我下载的是当前最新版本quartz-2.1.5。下载后,我们的压缩包里有:


docs文件夹:里面是Quartz的API、表数据库、图片文件夹

examples:里面是官方提供的一些DEMO

lib:第三方库,一些特性需要它们依靠

quartz:源码

quartz-*:支持各框架的源码

*.jar:一些JAR包

……

下面我们可以将官网下载的安装包里提供的例子导入到自己的IDE中,我使用的是MyEclipse8.5+Apache Tomcat6.0+JDK1.6.0。

创建一个Web应用程序,将第三方库lib文件夹下的jar包(quartz依赖的包)以及quartz-all-2.1.5.jar拷贝到WEB-INF/lib下,把examples/src文件夹拷贝到你的项目src下,刷新下项目,可能会出错,解决办法看这篇[MyEclipse中一些有趣的快捷键]这样即完成示例的准备工作。

来看官网提供的第一个例子:example1

注:将resources这个包里的log4j.xml、quartz_priority.properties这两个拷贝到src下,完整的如下:

先配置好日志文件,下面将会使用输出控制台打印出信息。

HelloJob.java

 
  
  1. package org.quartz.examples.example1; 
  2.  
  3. import java.util.Date; 
  4.  
  5. import org.slf4j.Logger; 
  6. import org.slf4j.LoggerFactory; 
  7. import org.quartz.Job; 
  8. import org.quartz.JobExecutionContext; 
  9. import org.quartz.JobExecutionException; 
  10.  
  11. /** 
  12.  * 这仅仅是一个打印"hello world"的工作例子 
  13.  * @author 束洋洋 
  14.  * @createDate 2012-6-4下午10:13:34 
  15.  */ 
  16. public class HelloJob implements Job { 
  17.  
  18.     private static Logger _log = LoggerFactory.getLogger(HelloJob.class); 
  19.  
  20.     /** 
  21.      * <p> 
  22.      * Empty constructor for job initilization 
  23.      * </p> 
  24.      * <p> 
  25.      * Quartz requires a public empty constructor so that the 
  26.      * scheduler can instantiate the class whenever it needs. 
  27.      * </p> 
  28.      */ 
  29.     public HelloJob() { 
  30.     } 
  31.  
  32.     /** 
  33.      * <p> 
  34.      * Called by the <code>{@link org.quartz.Scheduler}</code> when a 
  35.      * <code>{@link org.quartz.Trigger}</code> fires that is associated with 
  36.      * the <code>Job</code>. 
  37.      * </p> 
  38.      *  
  39.      * @throws JobExecutionException 
  40.      *             if there is an exception while executing the job. 
  41.      */ 
  42.     public void execute(JobExecutionContext context) 
  43.         throws JobExecutionException { 
  44.  
  45.         // Say Hello to the World and display the date/time 
  46.         _log.info("Hello World! - " + new Date()); 
  47.     } 
  48.  

这是任务执行类,需要实现job接口,在execute方法里写具体的任务实现。org.quartz.JobExecutionContext这个对象可以获取到任务调度程序里传递过来的参数,后面讲到。

SimpleExample.java(任务调度程序类)

Quartz框架执行任务调度步骤:

  1. 创建Scheduler对象,可以从SchedulerFactory类里取得。

      SchedulerFactory sf = new StdSchedulerFactory();

      Scheduler sched = sf.getScheduler();

创建JobDetail对象,执行任务调度的方法,这个方法实现了job接口

      JobDetail job = newJob(HelloJob.class)

            .withIdentity("job1", "group1")

            .build();

构造job的触发器对象,可以指定任务时间或周期。

      Trigger trigger = newTrigger()

            .withIdentity("trigger1", "group1")

            .startAt(runTime)

            .build();

告诉Quartz安排工作使用的触发器(安排任务)

      sched.scheduleJob(job, trigger);

开始调度任务程序

      sched.start();

暂停调度任务,调用standby()使Scheduler回到"stand-by"模式。再次调用start()方法,使Scheduler回到运行状态。 

      sched.standby();

停止调度任务,停止后不能重新开始。 

      sched.shutdown(true);

 
  
  1. /*  
  2.  * Copyright 2005 - 2009 Terracotta, Inc.  
  3.  *  
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); you may not  
  5.  * use this file except in compliance with the License. You may obtain a copy  
  6.  * of the License at  
  7.  *  
  8.  *   http://www.apache.org/licenses/LICENSE-2.0  
  9.  *    
  10.  * Unless required by applicable law or agreed to in writing, software  
  11.  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT  
  12.  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the  
  13.  * License for the specific language governing permissions and limitations  
  14.  * under the License. 
  15.  *  
  16.  */ 
  17.  
  18. package org.quartz.examples.example1; 
  19.  
  20. import static org.quartz.JobBuilder.newJob; 
  21. import static org.quartz.TriggerBuilder.newTrigger; 
  22. import static org.quartz.DateBuilder.*; 
  23.  
  24. import java.util.Date; 
  25.  
  26. import org.quartz.JobDetail; 
  27. import org.quartz.Scheduler; 
  28. import org.quartz.SchedulerFactory; 
  29. import org.quartz.Trigger; 
  30. import org.quartz.impl.StdSchedulerFactory; 
  31. import org.slf4j.Logger; 
  32. import org.slf4j.LoggerFactory; 
  33.  
  34. /** 
  35.  * This Example will demonstrate how to start and shutdown the Quartz  
  36.  * scheduler and how to schedule a job to run in Quartz. 
  37.  *  
  38.  * @author Bill Kratzer 
  39.  */ 
  40. public class SimpleExample { 
  41.  
  42.      
  43.     public void run() throws Exception { 
  44.         Logger log = LoggerFactory.getLogger(SimpleExample.class); 
  45.  
  46.         log.info("------- Initializing ----------------------"); 
  47.  
  48.         // First we must get a reference to a scheduler 
  49.         SchedulerFactory sf = new StdSchedulerFactory(); 
  50.         Scheduler sched = sf.getScheduler(); 
  51.  
  52.         log.info("------- Initialization Complete -----------"); 
  53.  
  54.         // computer a time that is on the next round minute 
  55.         Date runTime = evenMinuteDate(new Date()); 
  56.  
  57.         log.info("------- Scheduling Job  -------------------"); 
  58.  
  59.         // define the job and tie it to our HelloJob class 
  60.         JobDetail job = newJob(HelloJob.class
  61.             .withIdentity("job1""group1"
  62.             .build(); 
  63.          
  64.         // Trigger the job to run on the next round minute 
  65.         Trigger trigger = newTrigger() 
  66.             .withIdentity("trigger1""group1"
  67.             .startAt(runTime) 
  68.             .build(); 
  69.          
  70.         // Tell quartz to schedule the job using our trigger 
  71.         sched.scheduleJob(job, trigger); 
  72.         log.info(job.getKey() + " will run at: " + runTime);   
  73.  
  74.         // Start up the scheduler (nothing can actually run until the  
  75.         // scheduler has been started) 
  76.         sched.start(); 
  77.  
  78.         log.info("------- Started Scheduler -----------------"); 
  79.  
  80.         // wait long enough so that the scheduler as an opportunity to  
  81.         // run the job! 
  82.         log.info("------- Waiting 10 seconds... -------------"); 
  83.         try { 
  84.             // wait 65 seconds to show job 
  85.             Thread.sleep(10000);  
  86.             // executing... 
  87.         } catch (Exception e) { 
  88.         } 
  89.  
  90.         log.info("------- 暂停下程序... -------------"); 
  91.         sched.standby(); 
  92.         Thread.sleep(10000);  
  93.         log.info("------- 重新开始程序... -------------"); 
  94.         sched.start(); 
  95.         // shut down the scheduler 
  96.         log.info("------- Shutting Down ---------------------"); 
  97.         sched.shutdown(true); 
  98.         log.info("------- Shutdown Complete -----------------"); 
  99.     } 
  100.  
  101.     public static void main(String[] args) throws Exception { 
  102.  
  103.         SimpleExample example = new SimpleExample(); 
  104.         example.run(); 
  105.  
  106.     } 
  107.  

控制台打印信息:

 
  
  1. [INFO] 06 六月 09:29:06.906 下午 main [org.quartz.examples.example1.SimpleExample] 
  2. ------- Initializing ---------------------- 
  3.  
  4. [INFO] 06 六月 09:29:07.062 下午 main [org.quartz.impl.StdSchedulerFactory] 
  5. Using default implementation for ThreadExecutor 
  6.  
  7. [INFO] 06 六月 09:29:07.078 下午 main [org.quartz.simpl.SimpleThreadPool] 
  8. Job execution threads will use class loader of thread: main 
  9.  
  10. [INFO] 06 六月 09:29:07.125 下午 main [org.quartz.core.SchedulerSignalerImpl] 
  11. Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 
  12.  
  13. [INFO] 06 六月 09:29:07.125 下午 main [org.quartz.core.QuartzScheduler] 
  14. Quartz Scheduler v.2.1.5 created. 
  15.  
  16. [INFO] 06 六月 09:29:07.125 下午 main [org.quartz.simpl.RAMJobStore] 
  17. RAMJobStore initialized. 
  18.  
  19. [INFO] 06 六月 09:29:07.125 下午 main [org.quartz.core.QuartzScheduler] 
  20. Scheduler meta-data: Quartz Scheduler (v2.1.5'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED' 
  21.   Scheduler class'org.quartz.core.QuartzScheduler' - running locally. 
  22.   NOT STARTED. 
  23.   Currently in standby mode. 
  24.   Number of jobs executed: 0 
  25.   Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. 
  26.   Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. 
  27.  
  28.  
  29. [INFO] 06 六月 09:29:07.125 下午 main [org.quartz.impl.StdSchedulerFactory] 
  30. Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package'quartz.properties' 
  31.  
  32. [INFO] 06 六月 09:29:07.125 下午 main [org.quartz.impl.StdSchedulerFactory] 
  33. Quartz scheduler version: 2.1.5 
  34.  
  35. [INFO] 06 六月 09:29:07.125 下午 main [org.quartz.examples.example1.SimpleExample] 
  36. ------- Initialization Complete ----------- 
  37.  
  38. [INFO] 06 六月 09:29:07.140 下午 main [org.quartz.examples.example1.SimpleExample] 
  39. ------- Scheduling Job  ------------------- 
  40.  
  41. [INFO] 06 六月 09:29:07.171 下午 main [org.quartz.examples.example1.SimpleExample] 
  42. group1.job1 will run at: Wed Jun 06 21:30:00 CST 2012 
  43.  
  44. [INFO] 06 六月 09:29:07.171 下午 main [org.quartz.core.QuartzScheduler] 
  45. Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. 
  46.  
  47. [INFO] 06 六月 09:29:07.171 下午 main [org.quartz.examples.example1.SimpleExample] 
  48. ------- Started Scheduler ----------------- 
  49.  
  50. [INFO] 06 六月 09:29:07.171 下午 main [org.quartz.examples.example1.SimpleExample] 
  51. ------- Waiting 10 seconds... ------------- 
  52.  
  53. [INFO] 06 六月 09:29:17.171 下午 main [org.quartz.examples.example1.SimpleExample] 
  54. ------- 暂停下程序... ------------- 
  55.  
  56. [INFO] 06 六月 09:29:17.171 下午 main [org.quartz.core.QuartzScheduler] 
  57. Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused. 
  58.  
  59. [INFO] 06 六月 09:29:27.171 下午 main [org.quartz.examples.example1.SimpleExample] 
  60. ------- 重新开始程序... ------------- 
  61.  
  62. [INFO] 06 六月 09:29:27.171 下午 main [org.quartz.core.QuartzScheduler] 
  63. Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. 
  64.  
  65. [INFO] 06 六月 09:29:27.171 下午 main [org.quartz.examples.example1.SimpleExample] 
  66. ------- Shutting Down --------------------- 
  67.  
  68. [INFO] 06 六月 09:29:27.171 下午 main [org.quartz.core.QuartzScheduler] 
  69. Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down. 
  70.  
  71. [INFO] 06 六月 09:29:27.171 下午 main [org.quartz.core.QuartzScheduler] 
  72. Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused. 
  73.  
  74. [INFO] 06 六月 09:29:27.578 下午 main [org.quartz.core.QuartzScheduler] 
  75. Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete. 
  76.  
  77. [INFO] 06 六月 09:29:27.578 下午 main [org.quartz.examples.example1.SimpleExample] 
  78. ------- Shutdown Complete ----------------- 

这里使用了Thread.sleep(10000); 是为了给调度的程序有时间执行。

=======================================================================

以上属于个人观点,难免有错误,如发现错误请留言告之,我会订正的。

=======================================================================