搭建第一个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");

    }



}

 

你可能感兴趣的:(spring)