最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大。在考虑之后,决定整合更为专业的Quartz来实现定时任务功能。
首先,当然是添加依赖的jar文件,我的项目是maven管理的,以下的我项目的依赖:
或许你应该看出来了,我的项目是spring整合了mybatis,目前spring的最新版本已经到了4.x系列,但是最新版的mybatis-spring的整合插件所依赖推荐的依然是spring 3.1.3.RELEASE,所以这里没有用spring的最新版而是用了推荐的3.1.3.RELEASE,毕竟最新版本的功能一般情况下也用不到。
--------------------------------------分割线 --------------------------------------
基于 Spring 设计并实现 RESTful Web Services
Spring-3.2.4 + Quartz-2.2.0集成实例
Spring 3.x 企业应用开发实战 PDF完整高清扫描版+源代码
--------------------------------------分割线 --------------------------------------
至于quartz,则是用了目前的最新版2.2.1
之所以在这里特别对版本作一下说明,是因为spring和quartz的整合对版本是有要求的。
spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错。
至于原因,则是spring对于quartz的支持实现,org.springframework.scheduling.quartz.CronTriggerBean继承了org.quartz.CronTrigger,在quartz1.x系列中org.quartz.CronTrigger是个类,而在quartz2.x系列中org.quartz.CronTrigger变成了接口,从而造成无法用spring的方式配置quartz的触发器(trigger)。
在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法可以是普通类。很显然,第二种方式远比第一种方式来的灵活。
这里采用的就是第二种方式。
spring配置文件:
<!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->
<beanid="taskJob"class="com.tyyd.dw.task.DataConversionTask"/>
<beanid="jobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<propertyname="group"value="job_work"/>
<propertyname="name"value="job_work_name"/>
<!--false表示等上一个任务执行完后再开启新的任务-->
<propertyname="concurrent"value="false"/>
<propertyname="targetObject">
<refbean="taskJob"/>
</property>
<propertyname="targetMethod">
<value>run</value>
</property>
</bean>
<!-- 调度触发器 -->
<beanid="myTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<propertyname="name"value="work_default_name"/>
<propertyname="group"value="work_default"/>
<propertyname="jobDetail">
<refbean="jobDetail"/>
</property>
<propertyname="cronExpression">
<value>0/5 * * * * ?</value>
</property>
</bean>
<!-- 调度工厂 -->