实现思想:
1、配置一个ServletContextListener监听器
2、在监听器上配置一个定时器,用来执行定时任务
3、在任务管理器配置任务
实现代码:
Listener监听器类:
package com.chinacreator.report.listener;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.chinacreator.report.thread.ExcelTempFileManager;
/**
* 时间监听器
*
* @author xiaoqun.yi
*/
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();
}
}
}
// 监听器初始方法,不要弄错了
public void contextInitialized(ServletContextEvent sce) {
timer = new Timer();
systemTask = new SystemTaskTest(sce.getServletContext()
.getRealPath("/"), sce.getServletContext());
try {
sce.getServletContext().log("定时器已启动");
// 设置在每晚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("/");
Long time = Long.parseLong(every_time_run) * 1000;// 循环执行的时间
System.out.println("time" + time);
// 第一个参数是要运行的代码,第二个参数是指定时间执行,只执行一次
// timer.schedule(systemTask,time);
// 第一个参数是要运行的代码,第二个参数是从什么时候开始运行,第三个参数是每隔多久在运行一次。重复执行
timer.schedule(systemTask, 10000, time);
sce.getServletContext().log("已经添加任务调度表");
} catch (Exception e) {
}
}
public void contextDestroyed(ServletContextEvent sce) {
try {
timer.cancel();
} catch (Exception e) {
}
}
}
/**
* 时间任务器
*
* @author xiaoqun.yi
*/
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;
}
/**
* 把要定时执行的任务就在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();
}
}
}
execl.properties
#配置服务器excel文件存放的时间,以分钟为单位一天可以这样表示 :1440(60*24)为一天,等以此类推
file_retention_time=60
#一個小時執行一次
every_time_run=60package com.chinacreator.report.thread;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
/**
* 删除服务器上的文件
* @author xiaoqun.yi
*/
//实现Runnable接口(推荐),可以线程接口,预留一个extends(继承),方便扩展
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;
System.out.println("path____________________" + path);
}
/**
* 把线程要执行的代码放在run()中
*/
public void run() {
System.out.println("文件管理开始=========");
path = path + "exportExcel";
System.out.println("path?????" + path);
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);
}
}
}
web.xml中文件配置:
com.chinacreator.report.listener.ExcelTempFileListener
运行演示图:(本人更改的执行时间为23:17,方便演示)