1、在web.xml中添加監聽器
<listener>
<listener-class>
com.ydtf.oms.action.monitor.action.excelListener.ExcelTempFileListener
</listener-class>
</listener>
2、execl.properties#配置服務器excel文件存放的時間,以分鐘爲單位一天可以這樣表示 :1440(60*24)爲一天,等以此類推
#10080分鐘,刪除一週前的文件
file_retention_time=10080
#1440分鐘,一天執行一次
every_time_run=1440
3、java類package com.ydtf.oms.action.monitor.action.excelListener;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 時間監聽器
*
* @author shixf
*
*/
public class ExcelTempFileListener implements ServletContextListener {
private Timer timer;
private SystemTaskTest systemTask;
private static String every_time_run;
static {
Properties prop = new Properties();
InputStream inStrem = ExcelTempFileManager.class.getClassLoader()
.getResourceAsStream("execl.properties");
try {
prop.load(inStrem);
every_time_run = prop.getProperty("every_time_run");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inStrem.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
// 監聽器初始方法
public void contextInitialized(ServletContextEvent sce) {
timer = new Timer();
systemTask = new SystemTaskTest(sce.getServletContext()
.getRealPath("/"), sce.getServletContext());
try {
sce.getServletContext().log("定時器已啓動");
String s = "2018-1-8 17:12:00";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = format.parse(s);
// 設置在每晚24:0分執行任務
// Calendar calendar = Calendar.getInstance();
// //calendar.set(Calendar.HOUR_OF_DAY, 24); // 24 ,可以更改時間
// calendar.set(Calendar.MINUTE, 28); // 0可以更改分數
// calendar.set(Calendar.SECOND, 0);// 0 //默認爲0,不以秒計
// Date date = calendar.getTime();
// 監聽器獲取網站的根目錄
String path = sce.getServletContext().getRealPath("/");
// dstPath = ServletActionContext.getServletContext().getRealPath("/uploadNewTemplate/")+ "\\" + excelName;
Long time = Long.parseLong(every_time_run) *60 * 1000;// 循環執行的時間
//System.out.println("time" + time);
// 第一個參數是要運行的代碼,第二個參數是指定時間執行,只執行一次
// timer.schedule(systemTask,time);
// 第一個參數是要運行的代碼,第二個參數是從什麼時候開始運行,第三個參數是每隔多久在運行一次。重複執行
timer.schedule(systemTask, d, time);
sce.getServletContext().log("已經添加任務調度表");
} catch (Exception e) {
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
try {
timer.cancel();
} catch (Exception e) {
}
}
}
package com.ydtf.oms.action.monitor.action.excelListener;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
/**
* 刪除服務器上的文件
* 實現Runnable接口(推薦),可以線程接口,預留一個extends(繼承),方便擴展
*
* @author shixf
*/
public class ExcelTempFileManager implements Runnable {
private static String path;// 路徑
private static String RETENTION_TIME = "";// 文件保存的時間
static {
Properties prop = new Properties();
InputStream inStrem = ExcelTempFileManager.class.getClassLoader()
.getResourceAsStream("execl.properties");
try {
prop.load(inStrem);
RETENTION_TIME = prop.getProperty("file_retention_time");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inStrem.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 構造函數。初始化參數
*
* @param path
*/
public ExcelTempFileManager(String path) {
this.path = path;
}
/**
* 把線程要執行的代碼放在run()中
*/
@Override
public void run() {
path = path + "uploadNewTemplate";
File file = new File(path);
deletefiles(file);
}
/**
* 批量刪除文件
*
* @param folder
*/
public void deletefiles(File folder) {
File[] files = folder.listFiles();
for (int i = 0; i < files.length; i++) {
deleteFile(files[i]);
}
}
/**
* 刪除文件
*
* @param file
*/
private void deleteFile(File file) {
try {
if (file.isFile()) {
// 刪除符合條件的文件
if (canDeleteFile(file)) {
if (file.delete()) {
System.out.println("文件" + file.getName() + "刪除成功!");
} else {
System.out.println("文件" + file.getName() + "刪除失敗!此文件可能正在被使用");
}
} else {
}
} else {
System.out.println("沒有可以刪除的文件了");
}
} catch (Exception e) {
System.out.println("刪除文件失敗========");
e.printStackTrace();
}
}
/**
* 判斷文件是否能夠被刪除(刪除一週前的文件)
*/
private boolean canDeleteFile(File file) {
Date fileDate = getfileDate(file);
Date date = new Date();
long time = (date.getTime() - fileDate.getTime()) / 1000 / 60
- Integer.parseInt(RETENTION_TIME);// 當前時間與文件間隔的分鐘
if (time > 0) {
return true;
} else {
return false;
}
}
/**
* 獲取文件最後的修改時間
*
* @param file
* @return
*/
private Date getfileDate(File file) {
long modifiedTime = file.lastModified();
Date d = new Date(modifiedTime);
return d;
}
/**
* 格式化日期,沒有用到
*/
private String formatDate(Date date) {
// SimpleDateFormat f=new SimpleDateFormat("yyyyMMdd hh:mm:ss");//12小時制
SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd HH:mm:ss");// 24小時制
String formateDate = f.format(date);
return formateDate;
}
/**
* 刪除文件夾
*
* @param folder
*/
public void deleteFolder(File folder) {
if (folder.isDirectory()) {
File[] files = folder.listFiles();
for (int i = 0; i < files.length; i++) {
deleteFolder(files[i]);
}
// 非當前目錄,刪除
if (!folder.getAbsolutePath().equalsIgnoreCase(path)) {
// 只刪除在30分鐘前創建的文件
if (canDeleteFile(folder)) {
if (folder.delete()) {
System.out.println("文件夾" + folder.getName() + "刪除成功!");
} else {
System.out.println("文件夾" + folder.getName()
+ "刪除失敗!此文件夾內的文件可能正在被使用");
}
}
}
} else {
deleteFile(folder);
}
}
}
package com.ydtf.oms.action.monitor.action.excelListener;
import java.util.Date;
import java.util.TimerTask;
import javax.servlet.ServletContext;
/**
* 時間任務器
* @author shixf
*
*/
public class SystemTaskTest extends TimerTask {
private ServletContext context;
private String path;
private static String every_time_run;
public SystemTaskTest(String path, ServletContext context) {
this.path = path;
this.context = context;
}
@Override
/**
* 把要定時執行的任務就在run中
*/
public void run() {
ExcelTempFileManager etf;
try {
context.log("開始執行任務!");
// 需要執行的代碼
System.out.println(new Date().toLocaleString());
System.out.println("path======" + path);
etf = new ExcelTempFileManager(path);
etf.run();
context.log("指定任務執行完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、目錄5、參考網址
http://blog.csdn.net/lintianlin/article/details/40540831
http://blog.csdn.net/bestcxx/article/details/50298637
http://blog.csdn.net/u012750578/article/details/17346529