|
经过查阅较多相关资料,发现java定时器(java.util.Timer)有定时触发计划任务的功能,
通过配置定时器的间隔时间,在某一间隔时间段之后会自动有规律的调用预先所安排的计划任务
(java.util.TimerTask)。另外,由于我们希望当Web工程启动时,定时器能自动开始计时,
在整个Web工程的生命期里,定时器能在每晚深夜触发一次报表计算引擎。
因此定时器的存放位置也值得考查,不能简单的存在于单个Servlet或JavaBean中,
必须能让定时器宿主的存活期为整个Web工程生命期,在工程启动时能自动加载运行。
结合这两点,跟Servlet上下文有关的侦听器就最合适不过了,通过在工程的配置文件中加以合理配置,
会在工程启动时自动运行,并在整个工程生命期中处于监听状态。
......下面就Servlet侦听器结合Java定时器来讲述整个实现过程。
要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,
同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。
考虑定时器有个建立和销毁的过程,看了前面两个接口函数,
就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。
1、计时器类:
package myPackage;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class TimerTest implements ServletContextListener{
private Timer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new Timer(true);
event.getServletContext().log("定时器已启动");
timer.schedule(new TimerTask(){
public void run(){
//此处可以调用所需业务代码
System.out.println("上次执行时间:"+ this.scheduledExecutionTime());
}
}, 0, 10*1000);
event.getServletContext().log("已经添加任务调度表");
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log("定时器销毁");
}
}
2、编写完计时器类,最后一步就是把ServletContextListener部署到您的Web工程中去,
在您工程的web.xml配置文件中加入如下三行:
<listener>
<listener-class>myPackage.ContextListener</listener-class>
</listener> |
|