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了。
......下面就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();
}
}
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();
}
}
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 " );
}
}
import java.util.TimerTask;
/**
* 计划任务代码
* @author derek
* @version 1.0
*/
public class MyTask extends TimerTask{
public MyTask() {
}
/**
* 任务块
*/
public void run() {
System.out.println( " 定时器RUN " );
}
}