java quartz spi_java定时任务(二):Quartz

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值