今天在工做中遇到了定時刪除某個文件夾的全部內容的任務。
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>