我想实现一个点时器,于是使用Listener在web工程启动时开始计时启动,可是每次启动定时器后进入MyTask调度任务后总是不执行任务,我的任务暂时让它打印到控制台一条提示语句,可是我加断点调试发现每次都不执行控制台输出语句而之间结束任务,这是为什么呢,如下代码...添加一个定时器:
package timer;import java.util.Timer;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServlet;public class ContextListenerextends HttpServletimplements ServletContextListener { public ContextListener() { } private java.util.Timer timer = null; public void contextInitialized(ServletContextEvent event) { event.getServletContext().log("定时器已启动");
timer.schedule(new MyTask(event.getServletContext()), 0, 600);
event.getServletContext().log("已经添加任务调度表"); } public void contextDestroyed(ServletContextEvent event) { timer.cancel(); event.getServletContext().log("定时器销毁"); }}
MyTask任务的实现
package timer;import java.util.Calendar;
import java.util.TimerTask;import javax.servlet.ServletContext;public class MyTask extends TimerTask {
private static boolean isRunning = false; private static final int C_SCHEDULE_HOUR = 9; private ServletContext context = null; public MyTask() { } public MyTask(ServletContext context) {
this.context = context;
} @Override
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
context.log("开始执行指定任务");
System.out.print("任务开始");
isRunning = false;
context.log("指定任务执行结束");
}
} else {
context.log("上一次任务执行还未结束");
}
}
}
web里的Listener配置
<listener>
   <listener-class>timer.ContextListener</listener-class>
</listener>
这是执行后的结果
[09:51:19.484] WebApp[http://localhost:8082/resin-doc] starting
[09:51:19.656] WebApp[http://localhost:8082/timer] starting
[09:51:19.656] 定时器已启动
[09:51:19.656] 已经添加任务调度表
[09:51:19.953] action: init
[09:51:20.046] Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true
[09:51:20.046] Initializing, config='org.apache.struts.action.ActionResources', returnNull=true
[09:51:21.000] Initializing, config='com.yourcompany.struts.ApplicationResources', returnNull=true
[09:51:21.140] WebApp[http://localhost:8082/resin-admin] starting
[09:51:21.187] http listening to *:8082
[09:51:21.187] Resin started in 4922msrun方法里的两个条件都符合,都能判断进入,就是不执行
“context.log("开始执行指定任务");
System.out.print("任务开始");
isRunning = false;
context.log("指定任务执行结束");
”,
大侠们帮忙看看,我哪里出错了

解决方案 »

  1.   

    定时器启动了,我在web里配置的,启动项目时就开始启动定时器,然后每600毫秒再启动一次,我当时9点测试的,所以当条件满足9点且isruning等于false,但是就是不执行“context.log("开始执行指定任务");
    System.out.print("任务开始");
    isRunning = false;
    context.log("指定任务执行结束");
    ”,
    每次到context.log("开始执行指定任务");就直接跳出结束整个run方法
      

  2.   

    if (!isRunning) 把!去掉看看
      

  3.   

    去掉了,两个条件都去掉过,但是都不行,每次都是执行到context.log("开始执行指定任务");
    就直接结束run方法
      

  4.   

    简单的说楼主是想做一个定时器在web工程启动的时候启动吧。
    然后现在的问题我不明白。可以做一个servlet重写它的init()方法,来调用你的TimerTask主程序。
    例如:在web.xml中配置 <servlet>
      <description>This is the description of my J2EE component</description>
      <display-name>This is the display name of my J2EE component</display-name>
      <servlet-name>Log4jServlet</servlet-name>
      <servlet-class>com.test.servlet.Log4jServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
     </servlet>加入load-on-startup使得在web应用开启时自动执行。至于timetask类你怎么设计看自己了
      

  5.   

    6楼的,我明白你的也是,你是让我使用servlet来做定时器,我使用的是listener监听做的定时器,timetask类里的run方法里的任务不执行,就是不知道问题出现在哪里,我现在就用你说的servlet方法做一个
      

  6.   

    首先
    private java.util.Timer timer = null;这个是不是改成private java.util.Timer timer = new Timer();其次我感觉你的run方法写的有错误
      

  7.   

    我把private java.util.Timer timer =null;给过来了,也不行。
    你觉得我run方法里哪里有错误,你尽管说,我都试试,谢谢了
      

  8.   


    package org.servlet;public class Job1 {

    public void work(){
    System.out.println("job1 work");
    }
    }
    package org.servlet;import java.util.Calendar;
    import java.util.TimerTask;public class JobTimerTask extends TimerTask{ int hour = 13;
    @Override
    public void run() {
    // TODO Auto-generated method stub
    Calendar now = Calendar.getInstance();
    if(hour==now.get(Calendar.HOUR_OF_DAY)){
    Job1 j = new Job1();
    j.work();
    }

    }
    }
    package org.servlet;import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Timer;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;public class TimerTaskServlet extends HttpServlet { /**
     * Constructor of the object.
     */
    public TimerTaskServlet() {
    super();
    } /**
     * Destruction of the servlet. <br>
     */
    public void destroy() {
    super.destroy(); // Just puts "destroy" string in log
    // Put your code here
    } public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    } public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    } /**
     * Initialization of the servlet. <br>
     *
     * @throws ServletException if an error occurs
     */
    public void init() throws ServletException {
    // Put your code here
    Timer t = new Timer();
    JobTimerTask jt = new JobTimerTask();
    long delay = 1000;
    long period = 1000*60;
    t.schedule(jt, delay, period);

    }}将servlet设置load-on-startup为1
      

  9.   

    这个具体设计就不台清楚了。但是关于定时任务,csdn上网友建议的开源项目 quartz
    你可以了解下。