Tomcat下的定时任务

  1. package axtic.servlet;  
  2.  // 下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet侦听器需要实现 javax.servlet.ServletContextListener接口,同时实现它的 contextInitialized(ServletContextEvent event)和 contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个 接口函数,就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。  
  3.   
  4. import java.util.Timer;//定时器类  
  5. import axtic.bean.exportHistoryBean;  
  6. import javax.servlet.ServletContextEvent;  
  7. import javax.servlet.ServletContextListener;  
  8. public class SysContextListener implements ServletContextListener  
  9. {  
  10.   private Timer timer = null;  
  11.   public void contextInitialized(ServletContextEvent event)  
  12.   {//在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能  
  13.       timer = new Timer(true);  
  14.       event.getServletContext().log("定时器已启动");//添加日志,可在tomcat日志中查看到  
  15.       timer.schedule(new exportHistoryBean(event.getServletContext()),0,5*1000);//调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时。  
  16.       event.getServletContext().log("已经添加任务");  
  17.   }  
  18.   public void contextDestroyed(ServletContextEvent event)  
  19.   {//在这里关闭监听器,所以在这里销毁定时器。  
  20.       timer.cancel();  
  21.       event.getServletContext().log("定时器销毁");  
  22.   }  
  23. }  

 

接下来可以编写自己的功能类,此类一定要extends定时器类中TimerTask .下面介绍TimerTask的实现,上面的代码中看到了在构造Timer Task时,传入了javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入,因此需要重载Timer Task的构造函数(其父类java.util.TimerTask原构造函数是没有参数的)。在timer.schedule()的调度中,设置了每小 时调度一次,因此如果想实现调度任务每24小时被执行一次,还需要判断一下时钟点,以常量C_SCHEDULE_HOUR 表示(晚上12点,也即0点)。同时为防止24小时执行下来,任务还未执行完(当然,一般任务是没有这么长的),避免第二次又被调度以引起执行冲突,设置 了当前是否正在执行的状态标志isRunning。示例代码如下所示:

Java代码   收藏代码
  1. package axtic.bean;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.TimerTask;  
  5. import javax.servlet.ServletContext;  
  6. public class exportHistoryBean extends TimerTask  
  7. {  
  8.   private static final int C_SCHEDULE_HOUR = 0;  
  9.   private static boolean isRunning = false;  
  10.   private ServletContext context = null;   
  11.   public exportHistoryBean(ServletContext context)  
  12.   {  
  13.       this.context = context;   
  14.   }  
  15.   
  16.   public void run()  
  17.   {  
  18.     Calendar c = Calendar.getInstance();  
  19.     if(!isRunning)  
  20.     {  
  21.       if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY))  
  22.       {  
  23.         isRunning = true;  
  24.         context.log("开始执行指定任务");  
  25.         //-------------------开始保存当日历史记录  
  26.          
  27.          
  28.          
  29.         //在这里编写自己的功能,例:  
  30.         //File file = new File("temp");  
  31.         //file.mkdir();  
  32.         //启动tomcat,可以发现在tomcat根目录下,会自动创建temp文件夹  
  33.   
  34.         //-------------------结束  
  35.         isRunning = false;  
  36.         context.log("指定任务执行结束");  
  37.       }  
  38.       else  
  39.       {  
  40.         context.log("上一次任务执行还未结束");  
  41.       }  
  42.     }  
  43.   }  
  44. }  

 
最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中

Xml代码   收藏代码
  1. <web-app>  
  2.   
  3. <listener>  
  4.          <listener-class>  
  5.              axtic.servlet.SysContextListener  
  6.           </listener-class>  
  7. </listener>  
  8.   
  9.   
  10. <servlet/>  
  11. <servlet-mapping/>  
  12. </web-app>   

 这个J2EE小提示阐述了ServletContextListener的用法。这个事件类作为Web应用程序的一部分,处理Web应用程序的 servlet上下文(context)的变化的通知。这可以解释为,好像有个人在服务器旁不断地通知我们服务器在发生什么事件。那当然需要监听者了。因 此,在通知上下文(context)初始化和销毁的时候,ServletContextListner非常有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值