Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基于Java实现。Quartz具备以下特点:
1.强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
2.灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
3.分布式和集群能力
Quartz由于功能强大,又能够很轻易的就与spring集成在一起,所以实际开发中经常会用到。
一、引入Quartz包
org.quartz-scheduler
quartz
2.2.3
org.quartz-scheduler
quartz-jobs
2.2.3
二、详细配置
2.1 xml配置
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
使用quartz需要配置job、trigger、scheduler,其中:
job:任务的执行类,需要在xml中指明名称、组别和类
trigger:任务的触发器,需要指明名称、组别以及关联的job。一个触发器只能对应一个job;触发器有两种,分别为CronTriggerFactoryBean和SimpleTriggerFactoryBean,前者支持cron表达式,后者只支持一些简单的配置。
scheduler:调度器,需要将trigger配置在scheduler的triggers中,可以配置多个。这里自定义实现了jobFactory,可以在job中自动注入spring bean;applicationContextSchedulerContextKey属性用于在job中获取spring 的上下文。
2.2 代码清单
2.2.1 AutowiringSpringBeanJobFactory
packagecom.sawyer.job;importorg.quartz.spi.TriggerFiredBundle;importorg.springframework.beans.factory.config.AutowireCapableBeanFactory;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;importorg.springframework.scheduling.quartz.SpringBeanJobFactory;public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implementsApplicationContextAware {private transientAutowireCapableBeanFactory beanFactory;public void setApplicationContext(finalApplicationContext context) {
beanFactory=context.getAutowireCapableBeanFactory();
}
@Overridepublic Object createJobInstance(final TriggerFiredBundle bundle) throwsException {final Object job = super.createJobInstance(bundle);
beanFactory.autowireBean(job);returnjob;
}
}
自定义实现了JobFactory,就可以在job中自动注入bean
2.2.2 AbstractJob
packagecom.sawyer.job;importorg.quartz.Job;importorg.quartz.JobExecutionContext;importorg.quartz.JobExecutionException;/*** 抽象类,job需要继承该类,通过这种方式可以做一些自定义处理*/
public abstract class AbstractJob implementsJob {
@Overridepublic final void execute(JobExecutionContext jobExecutionContext) throwsJobExecutionException {try{
safeExecute(jobExecutionContext);
}catch(Exception e) {
JobExecutionException e2= newJobExecutionException(e);if (!ignoreException()) {if(isRefireImmediatelyWhenException()) {//立即重新运行当前job
e2.setRefireImmediately(true);
}else{//立即停止与当前Job有关的所有触发器,当前job不会再运行
e2.setUnscheduleAllTriggers(true);
}
}throwe2;
}
}public abstract void safeExecute(JobExecutionContext context) throwsException;/*** 是否忽略job运行时产生的异常*/
public abstract booleanignoreException();/*** 发生异常时是否立即重新执行JOB或将JOB挂起.
*
*
*@return{@codetrue} Job运行产生异常时,立即重新执行JOB.
* {@codefalse} Job运行产生异常时,挂起JOB等候管理员处理.*/
public abstract booleanisRefireImmediatelyWhenException();
}
AbstractJob是一个抽象类,凡是job都应该继承该类,通过这种方式可以job做一些自定义处理。如图中代码所示,AbstractJob中有4个方法:
ignoreException:是否忽略异常,返回true时忽略异常,否则必须处理。
isRefireImmediatelyWhenException:当出现异常时,是否立即重新执行。返回true时,立即重新执行,否则将会挂起所有与该job有关的trigger,不再执行。
safeExecute:子类需要实现该方法,在方法中定义具体的实现逻辑。
execute:接口job的实现方法,job最终是在该方法中执行的。只有这个方法才是Job自带的,其他的都是自定义方法。
2.2.3 TestJob
packagecom.sawyer.job;importorg.quartz.DisallowConcurrentExecution;importorg.quartz.JobDataMap;importorg.quartz.JobExecutionCont