需求:在一个开发的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)
我已经用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)
你google这个