-
使用 Servlet
技术中的 监听器
( ServletContextListener
)实现 定时器任务
—— 删除web项目中的临时文件
;
-
本代码中直接对 临时文件夹
和 其下的所有文件和文件夹
进行了全部删除操作,若需要对临时文件进行其他功能处理(如:回收站功能、删除指定过期时间的文件和文件夹等),请关注查看 监听器实现定时器任务
第二弹;
- 欢迎留言讨论,相互提升。
所使用的jar包
-
servlet-api.jar
-
log4j-1.2.17.jar
-
slf4j-api-1.6.6.jar
-
slf4j-log4j12-1.6.6.jar
源码
FileHandleListener.java
package web.timertask;
import java.io.File;
import java.util.Calendar;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 监听器实现定时器任务
* @ClassName: FileHandleListener
* @Author chalice
* @DateTime 2019年12月23日
*/
public class FileHandleListener implements ServletContextListener
{
private static final Logger LOGGER = LoggerFactory.getLogger(ServletContextListener.class);
@Override
public void contextDestroyed(ServletContextEvent contextEvent) {
LOGGER.info("监听器销毁中……");
}
@Override
public void contextInitialized(ServletContextEvent contextEvent) {
LOGGER.info("监听器启动中……");
// 作为接口实现类生成Runnable对象
Runnable runnable = new Runnable() {
public void run() {
cleanFiles();
}
};
ScheduledExecutorService service = Executors
.newSingleThreadScheduledExecutor();
// 获取初次启动并执行的延时时间(单位:分钟)
int delayMins = getFirstDelayTime();
// 第二个参数为“首次执行”的延时时间,第三个参数为“定时执行”的间隔时间
service.scheduleAtFixedRate(runnable, delayMins, 60 * 24, TimeUnit.MINUTES);
}
/**
* 根据每日定时任务执行的时间点,计算出初次启动并执行的延时时间(单位:分钟)
* @Author chalice
* @DateTime 2019年12月23日
* @return 初次启动并执行的延时时间(单位:分钟)
*/
private int getFirstDelayTime() {
int targetMins = 16 * 60 + 43; // 定时任务执行时间点(单位:分钟),样例:目标钟点数 * 60 + 目标分钟数
int result = 0;
// 获取当前时区、地区的日期时间的日期对象
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
int min = cal.get(Calendar.MINUTE);
int nowMins = hour * 60 + min;
if (nowMins > targetMins) {
result = (24 * 60) - nowMins + targetMins; // 次日
} else {
result = targetMins - nowMins; // 今日
}
return result;
}
/**
* 执行删除之前的处理
* 如:
* 1、处理删除x天前的文件;
* 2、将需要删除的文件移动到另一个临时文件夹中,再删除整个临时文件夹,避免因为删除错误而引起其他问题(回收站功能);
* @Author chalice
* @DateTime 2019年12月23日
* 备注:此处暂未作任何处理
*/
private void cleanFiles() {
String fileRootPath = "D:/delete";
File fileDir = new File(fileRootPath);
if (fileDir.exists())
{
deleteDir(fileDir);
}
}
/**
* 递归删除某文件夹
* @Author chalice
* @DateTime 2019年12月23日
* @param dir 删除的文件目录
* @return
*/
public Boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (String str : children) {
File file = new File(dir, str);
boolean success = deleteDir(file);
if (!success) {
LOGGER.error("删除失败,文件路径为:{};", file.getAbsolutePath());
continue;
}
LOGGER.info("删除成功,文件路径为:{};" + file.getAbsolutePath());
}
}
boolean success = dir.delete(); // 删除相对父目录(删除自身)
if (success) {
LOGGER.info("删除成功,文件路径为:{};" + dir.getAbsolutePath());
} else {
LOGGER.info("删除失败,文件路径为:{};" + dir.getAbsolutePath());
}
return success;
}
}
复制代码
配置文件
web.xml
<listener>
<display-name>监听器实现定时器任务</display-name>
<listener-class>web.timertask.FileHandleListener</listener-class>
</listener>
复制代码
原文
https://juejin.im/post/5e03412d6fb9a0161e593b5a