读书人

Quartz学习札记

发布时间: 2012-12-28 10:29:05 作者: rapoo

Quartz学习笔记

1. QuartZ简介

?

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

?

2. Quartz下载

?

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

?

3. Quartz结构简介

?

???
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/

读书人网 >编程

热点推荐