我有一个数据采集的程序,需要每天23:00运行,timer 的程序我已经写好了,请问如何用tomcat来把程序启动起来,就是做成一个系统进程,能够每天23点运行,谢谢!

解决方案 »

  1.   

    把timer实现javax.servlet.ServletContextListener。
    然后在web.xml里加上
    <listener> 
    <listener-class> 
    yourListener 
    </listener-class> 
    </listener>
      

  2.   


    把timer实现javax.servlet.ServletContextListener 这句话什么意思?
      

  3.   

    public class Timer implements javax.servlet.ServletContextListener { @Override
    public void contextDestroyed(ServletContextEvent event) {
    // TODO 启动任务 } @Override
    public void contextInitialized(ServletContextEvent event) {
    // TODO Auto-generated method stub }}
    <listener> 
    <listener-class> 
    Timer
    </listener-class> 
    </listener> 
      

  4.   


    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);
        }
    }
      

  5.   

    只要你的Tomcat不关,并且在Tomcat启动程序中创建了Timer对象在23点访问采集器
    这个可以很简单的测试出来,但是如果23:00你的Tomcat没有开,那就不行了!
      

  6.   


    怎么在Tomcat启动程序中创建Timer对象在23点访问采集器???
      

  7.   


    hi, 大哥,你这是新建了一个servlet??
      

  8.   

    如果非要在固定的时间运行可以将第二个参数用String初始化一下   SimpleDateFormat daySdf = new SimpleDateFormat("yyyy-MM-dd");
            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);
      

  9.   

    如果非要在固定的时间运行可以将第二个参数用String初始化一下   SimpleDateFormat daySdf = new SimpleDateFormat("yyyy-MM-dd");
            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);
      

  10.   


    我碰到一个小问题,
    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编译不通过,说没有这个方法,为什么呢?
      

  11.   

    建议你把jsp、servlet、filter的相关概念再仔细看看,如果你这么写完还是不知道怎么回事的
      

  12.   

    LZ注意看下代码public class TimeTaskServlet extends HttpServlet TimeTaskServlet 是继承自HttpServlet 的,所以可以super.init();
    用servlet的目的是在起站的时候加载这个servlet从而初始化Timer
      

  13.   

    你可以做一个线程tomcat启动时调用。每10分钟运行一次检查当前时间,不符合就sleep 10分钟。
      

  14.   

    用Servlet调用 线程来处理。
      

  15.   


    知道了,一着急忘了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.这是为什么呢?
      

  16.   

    我把编译好的类放在tomcat ROOT\WEB-INF\classes目录下, 还是不行
      

  17.   

    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.
    这个错误是为什么?
      

  18.   

    timer.schedule(j, new Date(), 3000l);第2个参数是第一次开始延迟多久才开始启动这个, 毫秒为单位是字符串数字
     没记错的话
      

  19.   


     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楼的写法.
      

  20.   

    非得用 Tomcat 吗?小题大做了吧。随便丢个 web 应用进去,然后在应用启动的时候创建一个 Timer 就行了。