需求:在一个开发的WEB项目中,客户提出每月15日WEB(需登录)能够自动保存一份数据。
我已经用httpclient实现了模拟登陆并保存数据的功能。接下来需要在项目中开发一个定时器,使这个方法在每月15日能够自动运行。方法一:在web.xml里配置一个Servlet,并设置其随web server的启动而启动。然后在该Servlet的init()方法里启动定时器,在destory()方法里销毁定时器。
方法二:在web.xml里配置一个Listener,然后在该Listener的初始化方法里启动定时器,在其销毁的方法里销毁定时器。因为需要模拟登陆,所以必须先启动web。所以采用方法一配置定时器。启动定时器:package com.stocom.service;import java.io.IOException;    
import java.util.Timer;    
import javax.servlet.RequestDispatcher;    
import javax.servlet.ServletContext;    
import javax.servlet.ServletException;    
import javax.servlet.http.HttpServlet;    
import javax.servlet.http.HttpServletRequest;    
import javax.servlet.http.HttpServletResponse;    
   
import org.apache.commons.lang.StringUtils;    
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import com.zbht.servlet.SystemStartup;
import com.zbht.util.ScheduledTaskDAO;
import com.zbht.util.TimerTaskManager;
   
public class ConvergeDataServlet extends HttpServlet {    
    
    private static Log logger = LogFactory.getLog(SystemStartup.class);
    private static final long serialVersionUID = 1L;    
   
    private Timer timer = null;    
        
    private Task task1;    
        
    /**   
     * Constructor of the object.   
     */   
    public ConvergeDataServlet() {    
        super();    
    }    
   
    /**   
     * Destruction of the servlet. 
  
     */   
    public void destroy() {    
        super.destroy();     
        if(timer!=null){    
            timer.cancel();    
        }    
    }    
   
        
    public void doGet(HttpServletRequest request, HttpServletResponse response)    
            throws ServletException, IOException {    
            
    }    
   
        
    public void doPost(HttpServletRequest request, HttpServletResponse response)    
            throws ServletException, IOException {    
        doGet(request, response);           
    }    
   
    // init方法启动定时器    
    public void init() throws ServletException {    
            
        ServletContext context = getServletContext();    
            
        // (true为用定时间刷新缓存)    
        String startTask = getInitParameter("startTask");    
                    
        // 定时刷新时间(分钟) 
        //Long delay = Long.parseLong(getInitParameter("intervalTime"));
            
        // 启动定时器    
        if(startTask.equals("true")){    
             
            timer = new Timer("CSSTimer", true);            timer.schedule(new TimerTaskManager(),0,60000);            logger.warn("定时器 " + "Timer" + " 已启动!");
        }    
    }    
}  
定时操作:public class TimerTaskManager extends TimerTask { private static Log logger = LogFactory.getLog(TimerTaskManager.class); private static LinkedHashMap TasksNextRunTime;

/**
 * URL执行成功返回HTML代码中标识字符:_RUN_SUCCESS
 */
public final static String VISIT_URL_SUCCESS_FLAG = "_RUN_SUCCESS";
private static boolean isRunning = false;
/* (non-Javadoc)
 * @see java.util.TimerTask#run()
 */
public void run() { if (!isRunning) {
            isRunning = true;
            System.out.println("开始执行指定任务");
            try{
             normalizeTimer();  //此方法用httpclient实现了模拟登陆并保存数据的功能
            }catch(Exception e){
             logger.error("异常信息:" + e.getMessage());
            }
            isRunning = false;
            System.out.println("指定任务执行结束");
        } else {
            System.out.println("上一次任务执行还未结束");
        } }
}web.xml配置如下:
        <servlet>
        <servlet-name>ConvergeDataServlet</servlet-name>     
        <servlet-class>com.stocom.service.ConvergeDataServlet</servlet-class>
        <init-param>
        <param-name>startTask</param-name>
        <param-value>true</param-value>
        </init-param>
        <init-param>
        <param-name>intervalTime</param-name>
        <param-value>1</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        </servlet>
调试报错:<ERROR> StandardWrapper.Throwablejava.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpMethod
at com.stocom.service.ConvergeDataServlet.init(ConvergeDataServlet.java:77)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1139)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:966)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3956)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4230)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.httpclient.HttpMethod
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1362)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1208)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
... 19 more
<2011-03-30 18:37:02> <main> org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3958) 
<ERROR> Servlet /stocom threw load() exceptionjava.lang.ClassNotFoundException: org.apache.commons.httpclient.HttpMethod
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1362)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1208)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
at com.stocom.service.ConvergeDataServlet.init(ConvergeDataServlet.java:77)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1139)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:966)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3956)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4230)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)