知道了,一着急忘了extends HttpServlet,我写好了一段代码:import java.util.*; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.*; import javax.servlet.http.*; public class TimeTaskServlet extends HttpServlet {
private static Timer timer = new Timer(); public void init(ServletConfig arg0) throws ServletException {
try { Timer timer = new Timer(); job j = new job(); //每3 秒执行一次job里面的run。 timer.scheduleAtFixedRate(j, new Date(), 3000l); int i = 0; //以下是一个循环,你可以忽略不看 while (true) { Thread.sleep(3000l); i++; System.out.println("rest"); if (i == 5) { timer.cancel(); System.out.println("cancle"); } if (i == 7) break; } } catch (Exception e) { System.out.println(e.toString()); }
//这里调用init方法 super.init(arg0);
}
class job extends TimerTask { public void run() {
System.out.println("Timer is running!"); } } }然后我把编译好的类放在tomcat ROOT目录下, 并且配置web.xml文件, <servlet> <servlet-name>TimeTaskServlet</servlet-name> <servlet-class>TimeTaskServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TimeTaskServlet</servlet-name> <url-pattern>/TimeTaskServlet</url-pattern> </servlet-mapping> 这样应该就可以了吧?可是我通过浏览器访问的时候,http://localhost:8080/TimeTaskServlet提示: Status reportmessage Servlet TimeTaskServlet is not availabledescription The requested resource (Servlet TimeTaskServlet is not available) is not available.这是为什么呢?
我把编译好的类放在tomcat ROOT\WEB-INF\classes目录下, 还是不行
type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException: Error instantiating servlet class TimeTaskServlet org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) java.lang.Thread.run(Thread.java:595) root cause java.lang.NoClassDefFoundError: TimeTaskServlet$job java.lang.Class.getDeclaredConstructors0(Native Method) java.lang.Class.privateGetDeclaredConstructors(Class.java:2357) java.lang.Class.getConstructor0(Class.java:2671) java.lang.Class.newInstance0(Class.java:321) java.lang.Class.newInstance(Class.java:303) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) java.lang.Thread.run(Thread.java:595) note The full stack trace of the root cause is available in the Apache Tomcat/5.5.20 logs. 这个错误是为什么?
timer.schedule(j, new Date(), 3000l);第2个参数是第一次开始延迟多久才开始启动这个, 毫秒为单位是字符串数字 没记错的话
public void init(ServletConfig arg0) throws ServletException {
try { Timer timer = new Timer(); job j = new job(); //每3 秒执行一次job里面的run。 timer.scheduleAtFixedRate(j, new Date(), 3000l); int i = 0; //以下是一个循环,你可以忽略不看 while (true) { Thread.sleep(3000l); i++; System.out.println("rest"); if (i == 5) { timer.cancel(); System.out.println("cancle"); } if (i == 7) break; } } catch (Exception e) { System.out.println(e.toString()); }
//这里调用init方法 super.init(arg0);
} LZ为什么要显示的去维护一个线程呢?如果要显示的维护一个线程那不需要用Timer了.Timer的作用就是维护多个轮询任务.你只要定义第一次执行的时间,及此后每隔多久执行该任务就可以了 这个servlet不需要去用URL访问,他只是负责了起站时初始化Timer及在应用的生命周期中保存这个Timer的实例. 在timer.scheduleAtFixedRate(j, new Date(), 3000l);这里j是一个TimerTask实例,你可以在run方法中定义你要做的事情.第二个参数是首次执行j.run()方法的时间,第三个参数是当首次执行j.run()后间隔多久再执行j.run() LZ起站抛的异常时因为,你的Job是个内部类.Timer中访问不到.不知你是否将这个内部类的Class放在classes目录下了.建议除非内部类真正有意义,在不了解内部类时使用它会出现一些初始化,访问问题. servlet的定义LZ可参考5楼的写法.
非得用 Tomcat 吗?小题大做了吧。随便丢个 web 应用进去,然后在应用启动的时候创建一个 Timer 就行了。
然后在web.xml里加上
<listener>
<listener-class>
yourListener
</listener-class>
</listener>
把timer实现javax.servlet.ServletContextListener 这句话什么意思?
public void contextDestroyed(ServletContextEvent event) {
// TODO 启动任务 } @Override
public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub }}
<listener>
<listener-class>
Timer
</listener-class>
</listener>
public class TimeTaskServlet extends HttpServlet {
private static Timer timer = new Timer();
public void init(ServletConfig arg0) throws ServletException {
timer.schedule(/*这里填写你要轮询的线程实例*/, new Date()/*第一次执行的时间*/, 600000/*每次执行的间隔*/);
super.init(arg0);
}
}
这个可以很简单的测试出来,但是如果23:00你的Tomcat没有开,那就不行了!
怎么在Tomcat启动程序中创建Timer对象在23点访问采集器???
hi, 大哥,你这是新建了一个servlet??
SimpleDateFormat dateTimeSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String today = daySdf.format(new Date());
String elevenStr =new StringBuilder(today).append(" 23:00:00").toString();
Date eleven = null;
try {
eleven = dateTimeSdf.parse(elevenStr);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(eleven);
SimpleDateFormat dateTimeSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String today = daySdf.format(new Date());
String elevenStr =new StringBuilder(today).append(" 23:00:00").toString();
Date eleven = null;
try {
eleven = dateTimeSdf.parse(elevenStr);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(eleven);
我碰到一个小问题,
public class TimeTaskServlet {
private static Timer timer = new Timer();
public void init(ServletConfig arg0) throws ServletException {
// 这个地方我会调用了
timer.schedule(/*这里填写你要轮询的线程实例*/, new Date()/*第一次执行的时间*/, 600000/*每次执行的间隔*/);
super.init(arg0);
}
我的super.init编译不通过,说没有这个方法,为什么呢?
用servlet的目的是在起站的时候加载这个servlet从而初始化Timer
知道了,一着急忘了extends HttpServlet,我写好了一段代码:import java.util.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
public class TimeTaskServlet extends HttpServlet {
private static Timer timer = new Timer();
public void init(ServletConfig arg0) throws ServletException {
try {
Timer timer = new Timer();
job j = new job();
//每3 秒执行一次job里面的run。
timer.scheduleAtFixedRate(j, new Date(), 3000l);
int i = 0; //以下是一个循环,你可以忽略不看
while (true) {
Thread.sleep(3000l);
i++;
System.out.println("rest");
if (i == 5) {
timer.cancel();
System.out.println("cancle");
}
if (i == 7)
break;
}
} catch (Exception e) {
System.out.println(e.toString());
}
//这里调用init方法
super.init(arg0);
}
class job extends TimerTask {
public void run() {
System.out.println("Timer is running!");
}
}
}然后我把编译好的类放在tomcat ROOT目录下, 并且配置web.xml文件, <servlet>
<servlet-name>TimeTaskServlet</servlet-name>
<servlet-class>TimeTaskServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TimeTaskServlet</servlet-name>
<url-pattern>/TimeTaskServlet</url-pattern>
</servlet-mapping> 这样应该就可以了吧?可是我通过浏览器访问的时候,http://localhost:8080/TimeTaskServlet提示:
Status reportmessage Servlet TimeTaskServlet is not availabledescription The requested resource (Servlet TimeTaskServlet is not available) is not available.这是为什么呢?
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
java.lang.Thread.run(Thread.java:595)
root cause java.lang.NoClassDefFoundError: TimeTaskServlet$job
java.lang.Class.getDeclaredConstructors0(Native Method)
java.lang.Class.privateGetDeclaredConstructors(Class.java:2357)
java.lang.Class.getConstructor0(Class.java:2671)
java.lang.Class.newInstance0(Class.java:321)
java.lang.Class.newInstance(Class.java:303)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
java.lang.Thread.run(Thread.java:595)
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.20 logs.
这个错误是为什么?
没记错的话
public void init(ServletConfig arg0) throws ServletException {
try {
Timer timer = new Timer();
job j = new job();
//每3 秒执行一次job里面的run。
timer.scheduleAtFixedRate(j, new Date(), 3000l);
int i = 0; //以下是一个循环,你可以忽略不看
while (true) {
Thread.sleep(3000l);
i++;
System.out.println("rest");
if (i == 5) {
timer.cancel();
System.out.println("cancle");
}
if (i == 7)
break;
}
} catch (Exception e) {
System.out.println(e.toString());
}
//这里调用init方法
super.init(arg0);
}
LZ为什么要显示的去维护一个线程呢?如果要显示的维护一个线程那不需要用Timer了.Timer的作用就是维护多个轮询任务.你只要定义第一次执行的时间,及此后每隔多久执行该任务就可以了
这个servlet不需要去用URL访问,他只是负责了起站时初始化Timer及在应用的生命周期中保存这个Timer的实例.
在timer.scheduleAtFixedRate(j, new Date(), 3000l);这里j是一个TimerTask实例,你可以在run方法中定义你要做的事情.第二个参数是首次执行j.run()方法的时间,第三个参数是当首次执行j.run()后间隔多久再执行j.run()
LZ起站抛的异常时因为,你的Job是个内部类.Timer中访问不到.不知你是否将这个内部类的Class放在classes目录下了.建议除非内部类真正有意义,在不了解内部类时使用它会出现一些初始化,访问问题.
servlet的定义LZ可参考5楼的写法.