首先需要一个任务类,这个类主要负责执行定时的任务。它是真正的worker。
import javax.servlet.ServletContext;
public class TimerTask extends java.util.TimerTask {
//application 对象,不是一定需要,但是可能实现某些功能时需要,所以最好作为参数传到当前对象中
private ServletContext ctx;
public TimerTask(ServletContext ctx) {
this.ctx = ctx;
}
@Override
public void run() {
//需要执行的任务放在这里执行。
System.out.println("-----------任务执行:"+ctx.getServerInfo());
}
}
-----------------------------------------------华丽的分割线--------------------------------------------------------------------------------
然后需要一个时间调度,这个类定义任务执行的时间,这个类通过
ServletContext listener实现。
public class TimerListener implements
ServletContextListener {
//时间调度
private Timer timer;
//任务类
private TimerTask task;
//格式化时间
private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//服务器停止时调用此方法
@Override
public void contextDestroyed(ServletContextEvent event) {
//停止时间调度
if(timer != null){
timer.cancel();
}
}
//服务器启动调用此方法
@Override
public void contextInitialized(ServletContextEvent event) {
try {
//true 设置为后台线程
timer=new Timer(true);
//实例化任务类
task=new TimerTask(event.getServletContext());
//开始任务的时间,这里的时间可以做成
可配置的,具体实现省略。
Date settime=sdf.parse("2014-01-09 10:01:00");
//距离开始还有多少毫秒,因为timer.schedule 不支持直接给定开始时间,而是一个long值
long starttime=settime.getTime()-new Date().getTime();
//这个任务会在2014-01-09 10:01:00 被执行,但只会执行一次
//如果需要循环执行,则 设置第三个参数,也是一个long值,例如:1000,表示在开始时间执行一次后,1000毫钟执行一次。
timer.schedule(task, starttime);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
---------------------------------------------------华丽的分割线----------------------------------------------------------------------------
最后在web.xml添加监听信息
<listener>
<listener-class>com.zjz.timer.TimerListener</listener-class>
</listener>