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了。
package
com.derek.servlet;
import
javax.servlet.
*
;
import
javax.servlet.http.
*
;
import
com.derek.pub.TimerManager;
/**
* 启动定时器的监听器
*
@author
derek
*
@version
1.0
*/
public
class
TimerListener
extends
HttpServlet
implements
ServletContextListener {
private
TimerManager tm
=
null
;
//
Notification that the web module is ready to process requests
public
void
contextInitialized(ServletContextEvent sce) {
int
day,hour,min,sec;
day
=
26
; hour
=
16
; min
=
42
; sec
=
0
;
tm
=
new
TimerManager(day,hour,min,sec);
}
//
Notification that the servlet context is about to be shut down
public
void
contextDestroyed(ServletContextEvent sce) {
tm.destoryTimer();
}
}
package
com.derek.pub;
import
java.util.Timer;
import
java.util.Date;
import
java.util.Calendar;
/**
* 定时器
*
@author
derek
*
@version
1.0
*/
public
class
TimerManager {
Timer t
=
null
;
public
TimerManager(
int
day,
int
hour,
int
min,
int
sec) {
time(day,hour,min,sec);
}
public
void
time(
int
day,
int
hour,
int
min,
int
sec){
Calendar c
=
Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH,day);
c.set(Calendar.HOUR_OF_DAY,hour);
c.set(Calendar.MINUTE,min);
c.set(Calendar.SECOND,sec);
Date date
=
c.getTime();
System.out.println(c.getTime());
t
=
new
Timer();
MyTask mt
=
new
MyTask();
t.schedule(mt,date);
}
public
void
destoryTimer(){
t.cancel();
}
}
package
com.derek.pub;
import
java.util.TimerTask;
/**
* 计划任务代码
*
@author
derek
*
@version
1.0
*/
public
class
MyTask
extends
TimerTask{
public
MyTask() {
}
/**
* 任务块
*/
public
void
run() {
System.out.println(
"
定时器RUN
"
);
}
}