- package
axtic.servlet; -
// 下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet侦听器需要实现 javax.servlet.ServletContextListener接口,同时实现它的 contextInitialized(ServletContextEvent event)和 contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个接口函数,就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。 -
- import
java.util.Timer; //定时器类 - import
axtic.bean.exportHistoryBean; - import
javax.servlet.ServletContextEvent; - import
javax.servlet.ServletContextListener; - public
class SysContextListener implementsServletContextListener - {
-
private Timer null;timer = -
public void contextInitialized(ServletContextEvent event) -
{//在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能 -
timer = new Timer( true); -
event.getServletContext().log("定时器已启动");//添加日志,可在tomcat日志中查看到 -
timer.schedule(new exportHistoryBean(event.getServletContext()), 0,5*1000);//调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时。 -
event.getServletContext().log("已经添加任务"); -
} -
public void contextDestroyed(ServletContextEvent event) -
{//在这里关闭监听器,所以在这里销毁定时器。 -
timer.cancel(); -
event.getServletContext().log("定时器销毁"); -
} - }
接下来可以编写自己的功能类,此类一定要extends定时器类中TimerTask .下面介绍TimerTask的实现,上面的代码中看到了在构造Timer Task时,传入了javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入,因此需要重载Timer Task的构造函数(其父类java.util.TimerTask原构造函数是没有参数的)。在timer.schedule()的调度中,设置了每小时调度一次,因此如果想实现调度任务每24小时被执行一次,还需要判断一下时钟点,以常量C_SCHEDULE_HOUR 表示(晚上12点,也即0点)。同时为防止24小时执行下来,任务还未执行完(当然,一般任务是没有这么长的),避免第二次又被调度以引起执行冲突,设置了当前是否正在执行的状态标志isRunning。示例代码如下所示:
- package
axtic.bean; -
- import
java.util.Calendar; - import
java.util.TimerTask; - import
javax.servlet.ServletContext; - public
class exportHistoryBean extendsTimerTask - {
-
private static final int C_SCHEDULE_HOUR 0;= -
private static boolean isRunning false;= -
private ServletContext null;context = -
public exportHistoryBean(ServletContext context) -
{ -
this.context = context; -
} -
-
public void run() -
{ -
Calendar c = Calendar.getInstance(); -
if(!isRunning) -
{ -
if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY)) -
{ -
isRunning = true; -
context.log("开始执行指定任务"); -
//-------------------开始保存当日历史记录 -
-
-
-
//在这里编写自己的功能,例: -
//File file = new File("temp"); -
//file.mkdir(); -
//启动tomcat,可以发现在tomcat根目录下,会自动创建temp文件夹 -
-
//-------------------结束 -
isRunning = false; -
context.log("指定任务执行结束"); -
} -
else -
{ -
context.log("上一次任务执行还未结束"); -
} -
} -
} - }
- <web-app>
-
- <listener>
-
<listener-class> -
axtic.servlet.SysContextListener -
</listener-class> - </listener>
-
-
- <servlet/>
- <servlet-mapping/>
- </web-app>