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/