java web 项目中 简单定时器实现 Timer

时间:2021-11-13 00:14:54

实现一个定时清理临时文件夹的任务 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>  
<listener-class>com.sxl.ContextListener</listener-class>
</listener>
到了这里   一个简单的定时器基本上实现了 也能跑通了   接下来 需要做的 就是根据自己项目的实际要求 去丰富定时器类 DelFileTask  和启动定时器的ContextListener 。