java web 项目中 简单定时器实现 Timer

来源:互联网 发布:淘宝企业账号审核 编辑:程序博客网 时间:2024/06/05 03:40

实现一个定时清理临时文件夹的任务 Timer

这个类最终功能是每天某个时间点(如每晚22点)执行某一功能。

首先,介绍Java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask)

如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000)。

    schedule方法的第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,

第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒。

由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期。

任务类  主要的业务代码

[java] view plain copy
 print?
  1. import java.util.TimerTask;    
  2.     
  3. import javax.servlet.ServletContext;    
  4.     
  5. /**  
  6.  * 定时器   
  7.  * @author sxl  
  8.  *  
  9.  */    
  10. public class DelFileTask extends TimerTask{    
  11.     
  12.     private static boolean isRunning = false;      
  13.       
  14.     private ServletContext context = null;      
  15.       
  16.     public DelFileTask() {    
  17.         super();    
  18.     }    
  19.         
  20.     public DelFileTask(ServletContext context) {      
  21.         this.context = context;      
  22.     }      
  23.     @Override    
  24.     public void run() {    
  25.             
  26.         if (!isRunning) {    
  27.                  
  28.             context.log("开始执行指定任务");     
  29.             /**  
  30.              * 自己的业务代码  
  31.              */    
  32.                 
  33.             isRunning = false;      
  34.             context.log("指定任务执行结束");    
  35.         } else {      
  36.             context.log("上一次任务执行还未结束");      
  37.      }    
  38.     }    
  39.     
  40. }  

这个类 主要是继承 TimerTask并实现它的run 方法

下面就是监听类了 监听服务器的启动并将任务添加到任务栈

[java] view plain copy
 print?
  1. import java.util.Calendar;    
  2. import java.util.Date;    
  3.     
  4. import javax.servlet.ServletContextEvent;    
  5. import javax.servlet.ServletContextListener;    
  6.     
  7. public class ContextListener implements ServletContextListener{    
  8.     
  9.     public ContextListener() {    
  10.     }    
  11.         
  12.      private java.util.Timer timer = null;      
  13.          
  14.     /**  
  15.      * 初始化定时器  
  16.      * web 程序运行时候自动加载    
  17.      */    
  18.     @Override    
  19.     public void contextInitialized(ServletContextEvent arg0) {    
  20.             
  21.          /**   
  22.          * 设置一个定时器   
  23.          */      
  24.         timer = new java.util.Timer(true);      
  25.               
  26.         arg0.getServletContext().log("定时器已启动");     
  27.       
  28.         /**   
  29.          * 定时器到指定的时间时,执行某个操作(如某个类,或方法)   
  30.          */      
  31.     
  32.             
  33.         //设置执行时间    
  34.         Calendar calendar =Calendar.getInstance();    
  35.         int year = calendar.get(Calendar.YEAR);    
  36.         int month = calendar.get(Calendar.MONTH);    
  37.         int day =calendar.get(Calendar.DAY_OF_MONTH);//每天    
  38.         //定制每天的1:00:00执行,    
  39.         calendar.set(year, month, day, 010000);    
  40.         Date date = calendar.getTime();    
  41. //        System.out.println(date);    
  42.             
  43.         int period = 24 * 60 * 60 * 1000;    
  44.         //每天的date时刻执行task,每隔persion 时间重复执行    
  45.         timer.schedule(new DelFileTask(arg0.getServletContext()), date, period);    
  46. //        在 指定的date时刻执行task, 仅执行一次    
  47. //        timer.schedule(new DelFileTask(arg0.getServletContext()), date);    
  48.             
  49.             
  50.         arg0.getServletContext().log("已经添加任务调度表");      
  51.             
  52.     }    
  53.     
  54.     /**  
  55.      * 销毁  
  56.      */    
  57.     @Override    
  58.     public void contextDestroyed(ServletContextEvent arg0){    
  59.     
  60.         timer.cancel();    
  61.         arg0.getServletContext().log("定时器销毁");    
  62.     }    
  63. }  
这个类 主要是设置一个调度器 并让他 按一定的要求去执行任务。

任务类 监听器类 都实现了 下一步就是在web.xml 配置监听器了 

[plain] view plain copy
 print?
  1. <listener>    
  2.         <listener-class>com.sxl.ContextListener</listener-class>      
  3. </listener>   
到了这里   一个简单的定时器基本上实现了 也能跑通了   接下来 需要做的 就是根据自己项目的实际要求 去丰富定时器类 DelFileTask  和启动定时器的ContextListener 。
原创粉丝点击