Spring温习(7)--有关定时任务Quartz的示例
实际项目中有关定时任务的使用还是比较普遍的,比如定时做报表,定时取数据,定时发送邮件等等,不过我们熟悉的并且比较方便的要么就是TimerTask要么就是Quartz,不过要按方便来讲和使用率来讲,大家还是普遍愿意在实际项目中使用更优秀的Quartz,尤其是和Spring配合起来十分方便,不过TimerTask也可以配置在Spring中
首先还是讲Quartz吧,之前大家都知道在不需要框架的项目中,我们的定时任务通常将执行代码写入到servlet的init方法中,然后在web.xml中配置
<servlet><servlet-name>Init</servlet-name><servlet-class>com.cn.util.timer.TestTimerTaskServlet</servlet-class><load-on-startup>1</load-on-startup> </servlet>
?
这样的代码,只要服务器一直在开启状态,就会按时执行任务的
一般来说Quart中有几个比教重要的概念:定时任务,触发器Trigger,调度器Scheduler,并且定时任务需要传入一个具体执行任务的类,这个类必须继承import org.quartz.Job这个类,并且实现execute这个方法,至于execute方法里面就是功能代码了,就是上面提到的统计报表,获取数据,发送邮件之类的事情了,欲了解更多的在Java中使用Quartz的知识请参考我很久以前写的有关Quartz的文章。
Spring和Quartz的整合
必须包
?
?
首先说一种不必继承任何类的具体定时任务的执行类JobTask.java
package com.javacrazyer.comon;public class JobTask {public void doJob(){System.out.println("执行发送邮件的程序...");}}
?
那么这个具体实现功能的类就没有继承任何其他第三方类
?Spring的配置文件applicationContext.xml具体配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"><bean id="jobTask" ref="jobTask" /> <!--目标bean中的目标方法:doJob方法,意思为将来执行定时任务就是该bean中的doJob方法--><property name="targetMethod" value="doJob" /></bean><!-- 使用triggers和SchedulerFactoryBean来包装任务 --><!--定义触发的时间--> <bean id="cronTrigger" ref="jobDetail" /><!-- cron表达式 秒 分 时 日 月 周 (年) --><property name="cronExpression" value="0/15 * * * * ?" /></bean><!-- 管理触发器,就相当于在java中使用Quartz代码中的调度器scheduler --><bean /></list></property></bean></beans>
?
有关cron表达式的的我之前的文章介绍过
?
大家发现没有JobDetail 那里配置指明了类,还必须指明具体要执行的方法,具体原因是MethodInvokingJobDetailFactoryBean这个类配置里面必须要求同时配上类和方法,所以我之前的类就没有继承任何类。
?
那么,如果有人懒得配置方法的话,还想按Quartz正常道路来走的话,那么具体执行类要变化了
package com.javacrazyer.comon;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.scheduling.quartz.QuartzJobBean;public class JobTask extends QuartzJobBean{@Overrideprotected void executeInternal(JobExecutionContext arg0)throws JobExecutionException {System.out.println("执行发送邮件的程序...");}}
?
并且spring配置中个JobDetail那个bean的整体换成
<bean id="jobDetail" name="code"><?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><!-- Spring ApplicationContext Definition --><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>
?
好了部署项目吧,启动tomcat吧,看看control控制台是不是每隔15秒就输出
执行发送邮件的程序...
?
?差点忘记还有TimerTask跟Spring的结合的配置,需要一个实现的具体类
package com.javacrazyer.comon;import java.util.TimerTask;public class EamilTask extends TimerTask{ @Overridepublic void run() {System.out.println("开始收取数据了.........");}}
?
spring配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"><bean id="eamilTask" /><!-- 对定时器进行设置每隔30秒调用一次emailTask --><bean id="springSchedule" ref="eamilTask"></property><property name="period"><value>10000</value></property><property name="delay"><value>1000</value></property></bean><!-- 启动定时器 --><bean id="startTimeTask" /></list></property></bean></beans>
?
?同样,启动服务器后,发现每隔10秒,执行下输出
开始收取数据了.........?
?