在工程的WEB-INF/web.xml配置文件中加入如下三行,所计划的任务就会在Web容器(或服务器)启动时自动开始执行了:  
<listener>  
    <listener-class>com.xxh.autoTask.ProjectServletContextListner</listener-class>  
</listener>

ProjectServletContextListner.java
package com.xxh.autoTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ProjectServletContextListner implements ServletContextListener {

    //定时器   
    private static java.util.Timer timer = null;
    
    
    //此方法仅在关闭Web容器(或服务器)时被调用一次   
    public void contextDestroyed(ServletContextEvent event) {
        // TODO Auto-generated method stub        
        timer.cancel();  
        event.getServletContext().log("定时器已销毁,任务执行结束");
    }

    //此方法仅在起动Web容器(或服务器)时被调用一次   
    public void contextInitialized(ServletContextEvent event) {
        // TODO Auto-generated method stub        
        timer = new java.util.Timer(true);  
        javax.servlet.ServletContext ctx = event.getServletContext();  
        ctx.log("定时器已启动,任务开始执行");  
        /*  
        //如果是用web.xml文件配置参数,则用下面的方式读取参数设置值  
        long   period   =   Long.valueOf((String)ctx.getInitParameter("period")).longValue();  
        */  
 
        timer.schedule(new NewTask(),   //   所需要执行的任务  
                         0,             //   延迟时间(0 --- 表示起动Web容器(或服务器)就立即执行此任务)  
                         30*1000        //   任务的执行间隔时间[单位:毫秒]   (此处的间隔时间是30秒)  
                       );  
    }

}


CustomTask.java
package com.xxh.autoTask;

public interface CustomTask {
   
    /** 
     *   用于实现自定义的任务 
     */ 
    public   void   execute(); 

}

CustomTask.java
package com.xxh.autoTask;

public class MyTask implements CustomTask {

    public void execute() {
        // TODO Auto-generated method stub
        System.out.println("在此方法中实现任务的主体");
    }

}


NewTask.java
package com.xxh.autoTask;

import java.util.TimerTask;

public class NewTask extends TimerTask {

    private static boolean isRunning  = false;   //运行标志(表示是否正在运行计划的任务) 
    private static int t = 3;
    private CustomTask ct = TaskFactory.getTask();  
   
    @Override
    public void run() {
        // TODO Auto-generated method stub
        if(!isRunning){   //当未执行此任务时则开始执行 
            if(ct != null){ 
                isRunning = true;    //将任务执行标志设置为正在执行 
                ct.execute();        //执行任务 
                isRunning = false;   //将任务执行标志设置为执行完毕 
            }else{ 
                if(t == 0)   return; 
                t--; 
                System.out.println(); 
                System.out.println("[Error] [com.xxh.autoTask.NewTask]  The   task   is   null."); 
                System.out.println("[Error] [com.xxh.autoTask.NewTask]  The   task   is   null."); 
                System.out.println("[Error] [com.xxh.autoTask.NewTask]  The   task   is   null."); 
            } 
        }else{ 
            System.out.println("The   task   is   running."); 
        }  

    }

}


TaskFactory.java
package com.xxh.autoTask;

public class TaskFactory {

    /** 
     *   功能:返回实现了CustomTask接口的类的实例对象 
     * 
     * 
     *   例:   如果实现了CustomTask接口的类名是MyTask, 
     *               return   new   MyTask(); 
     *           如上这样就可以了. 
     */ 
   public   static   CustomTask   getTask(){ 
       return new MyTask();
   }
   
}


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐