java定時刪除某個文件夾全部內容

        今天在工做中遇到了定時刪除某個文件夾的全部內容的任務。
java

        完成這個任務主要有兩個點:web

         1.定時器的實現spring

         2.何時執行定時器的任務
apache

          定時器的實現主要有4種方式:普通的thread、 TimerTask和Timer搭配、ScheduledExecutorService、quartz四中方式。這裏參考了http://blog.csdn.net/haorengoodman/article/details/23281343這篇文章,因爲之前用過了quartz這種方式,在這裏我選擇了ScheduledExecutorService這種方式ide

      定時任務的觸發方式我知道的有三種方式:spa

      1.servlet(經過在web.xml中配置load-on-startup加載)
.net

      2.listener
code

      3.spring提供的ScheduledTimerTask和TimerFactoryBeanorm

      本文主要採用listener的實現方式,實現了ServletContextListener接口,在應用上下文初始化的時候,觸發定時任務。xml

      如下貼出listener類和web.xml中listener的配置:

            

package com.shinow.hmsw.hminterface.file.timertask;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.lang3.StringUtils;

import com.shinow.hmsw.common.util.DateUtils;
import com.shinow.hmsw.common.util.ProUtil;

/**
 * 類說明:聊天文件處理監聽器
 *
 * @author guocheng
 * @version Version 1.0
 * @since JDK 1.7
 */
public class FileHandlerListener implements ServletContextListener {

	/* (non-Javadoc)
	 * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
	 */
	@Override
	public void contextInitialized(ServletContextEvent event) {
		Runnable runnable = new Runnable() {  
            public void run() {  
            	cleanFiles();
            }  
        };  
        ScheduledExecutorService service = Executors  
                .newSingleThreadScheduledExecutor();  
        // 第二個參數爲首次執行的延時時間,第三個參數爲定時執行的間隔時間  
        service.scheduleAtFixedRate(runnable, genInterTime(), 60*24, TimeUnit.MINUTES);  
	}
	
	/* (non-Javadoc)
	 * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
	 */
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
	}
	/**
	 * 刪除聊天文件
	 */
	private void cleanFiles() {
		String fileRootPath = ProUtil.getConfigValue("talk_files");
		Calendar c = Calendar.getInstance();
		String del_inter_time = ProUtil.getConfigValue("del_inter_time");
		Integer delInterTime = 7;
		if(StringUtils.isNotEmpty(del_inter_time)) {
			delInterTime = Integer.parseInt("del_inter_time");
		}
		c.add(Calendar.DATE, -delInterTime);
		String relativePath = File.separator + DateUtils.date2Str(new Date(), new SimpleDateFormat("yyyy-MM-dd"));
		File fireDir = new File(fileRootPath + relativePath);
		deleteDir(fireDir);
	}
	/**
	 * 遞歸刪除某個文件夾
	 * @param dir
	 * @return
	 */
	private boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
            for (int i=0; i<children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        return dir.delete();
    }
	/**
	 * 生成執行時間爲每日的22點
	 * @return
	 */
	private int genInterTime() {
		int target = 22 * 60;
		int result = 0;
		GregorianCalendar gc = new GregorianCalendar();
		int h = gc.get(GregorianCalendar.HOUR_OF_DAY);
		int m = gc.get(GregorianCalendar.MINUTE);
		int nowMinutes = h * 60 + m;
		if(nowMinutes <= target) {
			result = target - nowMinutes;
		} else {
			result = 24 * 60 - nowMinutes + target;
		}
		return result;
	}
}

       

<listener>
		<listener-class>com.shinow.hmsw.hminterface.file.timertask.FileHandlerListener</listener-class>
	</listener>
相關文章
相關標籤/搜索