转载

监听器实现定时器任务(一)

  1. 使用 Servlet 技术中的 监听器ServletContextListener )实现 定时器任务 —— 删除web项目中的临时文件
  2. 本代码中直接对 临时文件夹其下的所有文件和文件夹 进行了全部删除操作,若需要对临时文件进行其他功能处理(如:回收站功能、删除指定过期时间的文件和文件夹等),请关注查看 监听器实现定时器任务 第二弹;
  3. 欢迎留言讨论,相互提升。

所使用的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
正文到此结束
Loading...