搭建第一个web项目:quartz+spring实现定时任务
测试过程:
先写了一个简单的任务类,测试配置的quartz是否启作用(最终目的是实现定时删除临时储存文件夹)。
spring中添加的配置文件如下:
<!--定时任务 quartz (spring内部集成) --> <!-- 定时清空临时文件夹的任务类 --> <bean id="taskJob" class="cn.itcast.oa.util.TaskJob"></bean> <!-- 定义目标bean和bean中的方法 --> <bean id="Job" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref local="taskJob" /> </property> <property name="targetMethod"> <!-- 要执行的方法名称 --> <value>Count</value> </property> </bean> <!--定义触发的时间 --> <bean id="cron" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="Job" /> </property> <property name="cronExpression"> <value>0-59 * * * * ?</value> </property> </bean> <!-- 管理触发器 --> <bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="cron" /> </list> </property> </bean>
任务类如下:
package cn.itcast.oa.util; /** * 定时任务,清空临时文件夹 * * @author haojiahong * * @createtime:2015-7-21 下午2:23:55 * * */ public class TaskJob { static long Count = 0; public TaskJob() { System.out.println("Bean initialized."); } public void doFirst() { Count(); } public void Count() { Count++; System.out.print("Count="); System.out.println(Count); } }
最后测试成功,输出的结果如下:(任务类实例化之后,每隔一秒钟,调用一次Count方法)
信息: Initializing Spring root WebApplicationContext 16:38:10,184 DEBUG MyApplicationContextUtil:24 - applicationContext进行设置完成。。。 16:38:10,200 DEBUG FtpStore:31 - 初始化了FTP服务器配置参数 Bean initialized. Count=1 Count=2 Count=3 2015-7-22 16:38:12 org.apache.coyote.http11.Http11Protocol start 信息: Starting Coyote HTTP/1.1 on http-8888 2015-7-22 16:38:12 org.apache.jk.common.ChannelSocket init 信息: JK: ajp13 listening on /0.0.0.0:8009 2015-7-22 16:38:12 org.apache.jk.server.JkMain start 信息: Jk running ID=0 time=0/16 config=null 2015-7-22 16:38:12 org.apache.catalina.startup.Catalina start 信息: Server startup in 7605 ms Count=4 Count=5 Count=6 Count=7 Count=8 Count=9 Count=10 Count=11 Count=12 Count=13 Count=14
第一次配置的时候出现了如下异常:
Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:621) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1817) at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204) at org.springframework.util.ClassUtils.forName(ClassUtils.java:211) at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:385) at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1138) ... 49 more
原因是Spring 3.0版本中内置的Quartz版本是<2.0的,在使用最新的Quartz包(>2.0)之后,接口不兼容。
解决办法有两种:
1.降低Quartz版本,降到1.X去。
2.升级Spring版本到3.1+,根据Spring的建议,将原来的**TriggerBean替换成**TriggerFactoryBean,例如CronTriggerBean 就可以替换成 CronTriggerFactoryBean。替换之后问题解决。
最后是自己写的删除临时文件夹及其文件的任务类:
package cn.itcast.oa.util; import java.io.File; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 定时任务,清空临时文件夹 * * @author haojiahong * * @createtime:2015-7-21 下午2:23:55 * * */ public class TaskJob { private Log log = LogFactory.getLog(this.getClass()); public TaskJob() { log.debug("初始化定时任务类完成。。"); } public void exceteDelJob() { String tempPath = (String) this.getAppConfig().getAppExtProp() .get("fileTempPath"); System.out.println(tempPath); if (!delFile(tempPath)) { return; } } private boolean delFile(String tempPath) { File file = new File(tempPath); if (!file.exists()) { log.debug("文件夹不存在"); return false; } if (file.isFile()) { file.delete(); log.debug("单个文件删除成功"); return true; } File[] files = file.listFiles(); for (File f : files) { if (f.isFile()) { f.delete(); log.debug("文件夹中单个文件删除成功"); } else { this.delFile(f.getAbsolutePath()); log.debug("开始删除文件夹中的文件夹"); } } file.delete(); return true; } public AppConfig getAppConfig() { return (AppConfig) ApplicationUtil.getBean("appConfig"); } }