实现一个定时清理临时文件夹的任务 Timer
这个类最终功能是每天某个时间点(如每晚22点)执行某一功能。
首先,介绍Java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask)
如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000)。
schedule方法的第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,
第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒。
由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期。
任务类 主要的业务代码
import java.util.TimerTask;
import javax.servlet.ServletContext;
/**
* 定时器
* @author sxl
*
*/
public class DelFileTask extends TimerTask{
private static boolean isRunning = false;
private ServletContext context = null;
public DelFileTask() {
super();
}
public DelFileTask(ServletContext context) {
this.context = context;
}
@Override
public void run() {
if (!isRunning) {
context.log("开始执行指定任务");
/**
* 自己的业务代码
*/
isRunning = false;
context.log("指定任务执行结束");
} else {
context.log("上一次任务执行还未结束");
}
}
}
这个类 主要是继承 TimerTask并实现它的run 方法
下面就是监听类了 监听服务器的启动并将任务添加到任务栈
import java.util.Calendar;这个类 主要是设置一个调度器 并让他 按一定的要求去执行任务。
import java.util.Date;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ContextListener implements ServletContextListener{
public ContextListener() {
}
private java.util.Timer timer = null;
/**
* 初始化定时器
* web 程序运行时候自动加载
*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
/**
* 设置一个定时器
*/
timer = new java.util.Timer(true);
arg0.getServletContext().log("定时器已启动");
/**
* 定时器到指定的时间时,执行某个操作(如某个类,或方法)
*/
//设置执行时间
Calendar calendar =Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day =calendar.get(Calendar.DAY_OF_MONTH);//每天
//定制每天的1:00:00执行,
calendar.set(year, month, day, 01, 00, 00);
Date date = calendar.getTime();
// System.out.println(date);
int period = 24 * 60 * 60 * 1000;
//每天的date时刻执行task,每隔persion 时间重复执行
timer.schedule(new DelFileTask(arg0.getServletContext()), date, period);
// 在 指定的date时刻执行task, 仅执行一次
// timer.schedule(new DelFileTask(arg0.getServletContext()), date);
arg0.getServletContext().log("已经添加任务调度表");
}
/**
* 销毁
*/
@Override
public void contextDestroyed(ServletContextEvent arg0){
timer.cancel();
arg0.getServletContext().log("定时器销毁");
}
}
任务类 监听器类 都实现了 下一步就是在web.xml 配置监听器了
<listener>到了这里 一个简单的定时器基本上实现了 也能跑通了 接下来 需要做的 就是根据自己项目的实际要求 去丰富定时器类 DelFileTask 和启动定时器的ContextListener 。
<listener-class>com.sxl.ContextListener</listener-class>
</listener>