设为首页 收藏本站
查看: 1192|回复: 0

[经验分享] Tomcat下的定时任务

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-12 09:42:11 | 显示全部楼层 |阅读模式

  • 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 implements ServletContextListener   
  • {  
  •   private Timer timer = null;  
  •   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。示例代码如下所示:



Java代码   DSC0000.png

  • package axtic.bean;  
  •   
  • import java.util.Calendar;  
  • import java.util.TimerTask;  
  • import javax.servlet.ServletContext;  
  • public class exportHistoryBean extends TimerTask   
  • {  
  •   private static final int C_SCHEDULE_HOUR = 0;  
  •   private static boolean isRunning = false;   
  •   private ServletContext context = null;   
  •   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("上一次任务执行还未结束");  
  •       }  
  •     }  
  •   }  
  • }  
   最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中



Xml代码  

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-97787-1-1.html 上篇帖子: 查看tomcat端口号 下篇帖子: nginx整合tomcat
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表