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. 参考资料