Quartz学习笔记

1. QuartZ简介

 

    Quartz是OpenSymphony公司的一个开源项目,主要用于复杂的任务调度。

 

2. Quartz下载

 

    请到官方网站http://www.opensymphony.com/下载最新的Quart版本进行学习,本人下载的为quartz-1.8.4。

 

3. Quartz结构简介

 

   

 

        错误:trigger为一Abstract类而非Interface

 

Job: 任务接口,必须存在一public无参构造方法,要调度的任务必须实现此接口。

 

JobDetail: Quartz不直接使用Job接口,而是通过JobDetail来使用Job接口,JobDetail中有一属性为Class jobClass,

                   这也是实现Job接口时必须存在一public无参构造方法的原因。可通过JobDataMap向Job传输数据。

           每一个Job都有一个jobName和groupName与之对应,并且在同一个Scheduler中必须唯一。

 

Trigger: 任务执行的条件。

          每一个Trigger都有一个name和group与之对应,并且在同一个Scheduler中也必须唯一。

          一个Trigger只能指向一个JobDetail,而不同的Trigger可以指向同一个JobDetail。

                 可以通过JobDataMap向Job传输数据。

 

SimpleTrigger: Trigger的子类,根据一定频率以及次数对任务进行调度。

 

CronTrigger: Trigger的子类,根据Cron表达式对任务进行调度。

                       关于Cron表达式可参考附件详解。

 

Scheduler: 对在其内注册的JobDetail根据相应的Trigger进行调度。

                   通过SchedulerFactory生成实例。

 

注:上述信息均可在Quartz API中参阅得出。

 

4. Quartz应用实例

   

    包的导入:将quartz-all-1.8.4.jar 以及其依赖包 lib\log4j-1.2.14.jar, lib\slf4j-api-1.6.0.jar, lib\slf4j-log4j12-1.6.0.jar导入到项目中。

  

1)JobImpl: 任务

/**
 * JobImpl.java
 * Create by Administrator at 9:22:04 PM
 */
package com.siyuan.quartz;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * @author Administrator
 * @Description 需要被调度执行的任务
 */
public class JobImpl implements Job {

 /* (non-Javadoc)
  * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
  */
 public void execute(JobExecutionContext ctxt) throws JobExecutionException {
  // TODO Auto-generated method stub
  JobDetail detail = ctxt.getJobDetail();
  JobDataMap data = detail.getJobDataMap();
  if (data.containsKey("name")) {
   System.out.println(data.getString("name"));
  }
  System.out.println("Current time: " + new Date());
 }

}

2)SimpleTriggerTest: SimpleTrigger测试

/**
 * SimpleTrigger.java
 * Create by Administrator at 9:30:42 PM
 */
package com.siyuan.quartz;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @author Administrator
 * @Description
 */
public class SimpleTriggerTest {
 
 /**
  * Job循环执行之间的时间间隔10s
  */
 public static final int PERIOD_BETWEEN_LOOP = 1000 * 10;
 
 /**
  * Job循环执行的次数
  */
 public static final int REPEAT_TIME = 3;
 
 /**
  * @param args
  * @throws SchedulerException
  */
 public static void main(String[] args) throws SchedulerException {
  //Quartz不使用Job实例,而是通过JobDetail来使用Job实例
  //Job 1-1 JobDetail
  JobDetail job = new JobDetail("current time printer", "test", JobImpl.class);
  //通过JobDataMap向Job中传递数据
  job.getJobDataMap().put("name", "current time printer test");
  
  Calendar calendar = GregorianCalendar.getInstance();
  calendar.set(Calendar.MINUTE, 40);
  calendar.set(Calendar.SECOND, 0);
  Date startTime = calendar.getTime();

  //trigger n-1 JobDetail
  SimpleTrigger trigger = new SimpleTrigger("simple trigger", "test");
  //假如startTime>=currentTime,则在startTime执行第一次
  //假如startTime<currentTime,则立即执行第一次
  trigger.setStartTime(startTime);
  trigger.setRepeatInterval(PERIOD_BETWEEN_LOOP);
  //Job总的执行次数为REPEAT_TIME+1
  trigger.setRepeatCount(REPEAT_TIME);
//  trigger.setJobName("current time printer");
//  trigger.setJobGroup("test");
  
  SimpleTrigger trigger1 = new SimpleTrigger("simple trigger1", "test");
  calendar.set(Calendar.MINUTE, 45);
  trigger1.setNextFireTime(calendar.getTime());
//  trigger1.setJobName("current time printer");
//  trigger1.setJobGroup("test");
  
  SchedulerFactory schdlFactory = new StdSchedulerFactory();
  Scheduler schdl = schdlFactory.getScheduler();
  
  // JobDetail n-1 Scheduler
  //方式1,缺点,不能实现JobDetail n-1 Scheduler
  //把schdl.scheduleJob(job, trigger1)注释删除将会报错
  schdl.scheduleJob(job, trigger);
//  schdl.scheduleJob(job, trigger1);
  //方式2
//  schdl.addJob(job, true);
//  schdl.scheduleJob(trigger);
//  schdl.scheduleJob(trigger1);
  
  //scheduler创建后处于"standy-by"状态,此时将不会触发任何触发器
  schdl.start();
 }
}

3)CronTriggerTest:CronTrigger测试

/**
 * CronTriggerTest.java
 * Create by Administrator at 11:36:45 PM
 */
package com.siyuan.quartz;

import java.text.ParseException;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @author Administrator
 * @Description
 */
public class CronTriggerTest {
 
 /**
  * CRON表达式:每天23点每一分钟的0,10,20,30,40,50S运行Job
  */
 public static final String CRON_EXP = "0/10 * 23 * * ?";
 
 /**
  * @param args
  * @throws ParseException
  * @throws SchedulerException
  */
 public static void main(String[] args) throws ParseException, SchedulerException {
  JobDetail job = new JobDetail("current time printer", "test", JobImpl.class);
  
  CronTrigger trigger = new CronTrigger("cron trigger", "test", CRON_EXP);
  
  SchedulerFactory schdlFactory = new StdSchedulerFactory();
  Scheduler schdl = schdlFactory.getScheduler();
  
  schdl.scheduleJob(job, trigger);
  
  schdl.start();
 }

}

5. 参考资料

  

   http://www.ibm.com/developerworks/cn/java/j-quartz/