Spring定时器初接触Spring+quartz

工作的时候遇到需要使用定时器的地方,要求晚上定时删除缓存文件夹下的文件.初步研究了一下Spring的定时器;

Spring的定时器选择的是Quartz,Spring使用Quartz需要有4个步骤

一、创建定时任务job

  Quartz创建定时任务有两种方式,一个是继承类,继承:org.springframework.scheduling.quartz.QuartzJobBean类进行创建,另一个是直接创建一个普通的java类,在后面的步骤中指定定时方法,这个方式的耦合性低,推荐,我也是使用的这个方式. 

  创建java类作为定时任务:

package com.trs.project.task;

import java.io.File;

import org.apache.log4j.Logger;

import com.databasesearch.util.ReadUtil;

public class DeleteTempFile {
    Logger logger = Logger.getLogger(getClass());

    private String path = "";

    
    
    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }
    
    /**
     * 删除产生的临时文件
     */
    public void deleteTemp() {
        if (ReadUtil.isNotNull(path)) {
            delFile(path);
        }
    }

    private void delFile(String path) {
        File file = new File(path);
        if (file.exists()) {
            String[] tempList = file.list();
            File temp = null;
            for (int i = 0; i < tempList.length; i++) {
                if (path.endsWith(File.separator)) {
                    temp = new File(path + tempList[i]);
                } else {
                    temp = new File(path + File.separator + tempList[i]);
                }
                if (temp.isFile()) {
                    if(temp.delete()){
                        logger.info("删除缓存文件"+temp.getName());
                    }
                }

            }

        }
    }
}

创建完任务后,在Spring中创建该bean

<!--定时删除temp文件夹下的文件 -->
    <bean name="DeleteTempFile" class="com.trs.project.task.DeleteTempFile" init-method="deleteTemp">
        <property name="path" value="D:\TRS\TRSWCMV7\Tomcat\temp" />
    </bean>

二、配置JobDetail

<bean id="DeleteTempFilequartz"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="DeleteTempFile" />
        <property name="targetMethod" value="deleteTemp" />
        <!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
        <property name="concurrent" value="false" />
    </bean>

其中targetObject为上面创建的bean对象

targetMethod为执行的定时任务方法

三、配置触发器

<bean id="DeleteTempFilequartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="DeleteTempFilequartz" />
        </property>
        <property name="cronExpression">
            <!--每天一点执行一次  -->
            <value>* * 0 1 * ? </value>
        </property>
    </bean>

这边使用的cron触发器,还有一种触发器是org.springframework.scheduling.quartz.SimpleTriggerFactoryBean,这种触发器的写法为:

<bean id="exampleJobTrigger"  
    class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">  
    <property name="jobDetail" ref="DeletTempFilequartz" />  
    <!-- 延迟触发时间,延迟10秒进行触发 -->  
    <property name="startDelay" value="10000" />  
    <!-- 重复触发的时间间隔,5秒 -->  
    <property name="repeatInterval" value="5000" />  
</bean>  

cron触发器可以很灵活的配置触发时间,如上方写的 0 0 1 *  * ?  依次为秒,分,时,月,星期,年具体可以看quartz的官方网站:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/crontrigger.html

四、配置SchedulerFactoryBean

 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
      <property name="triggers">
            <list>
                   <ref bean="DeleteTempFilequartzTrigger" />
            </list>
        </property>
     <property name="autoStartup" value="true" />
 </bean>

这样,配置定时器就完成了.

 

 

 

 

 

 

 

 

 

  

posted @ 2017-11-13 15:59  司霖  阅读(180)  评论(0编辑  收藏  举报