2012-03-28 73 views
1

我有一个ScheduledExecutorService,我每15分钟执行一次任务(在Tomcat的Web应用程序中)。
ServletContextListenercontextDestroyed我做:关闭程序在执行程序中如何工作?

Runtime.getRuntime().addShutdownHook(new Thread(){ 
      @Override 
      public void run(){ 
       scheduler.shutdown(); 
      } 
     });  

启动调度程序,如:

final Runnable r = new Runnable(){ 

      @Override 
      public void run() { 
       System.out.println("My task"); 
       //Do some task 
      } 

     }; 
updater.scheduleWithFixedDelay(r, 30, 15, TimeUnit.MINUTES); 

问题:在shutdown不执行任何余下的任务。
有一个任务正在运行,但我没有看到任何日志,所以它似乎没有执行。为什么?

UPDATE:
如果我启动tomcat再经过2分钟,我关机则是不被视为计划和必须运行的任务?我的意思是,如果提交任务不被视为等待?或者它必须实际运行?

回答

0

我不能完全解析你的问题,但也许你的应用程序没有像你期望的那样退出?

关闭Executor将停止提交任何任务,但任何正在运行的任务将继续运行,直到它们退出。从shutdown()的javadoc:

发起以前提交 任务的执行一个有序的关闭,但没有新的任务将被接受。 如果已关闭,调用没有其他影响。

如果你编辑你的问题更清楚,我们可以更合适地回答。

+0

我Tomcat.The关机时运行的是里面的ServletContextListener。我停止使用'shutdown' – Jim 2012-03-28 13:20:26

+0

通常,您需要实现自己的逻辑,以1)处理队列中的所有(或超时)未处理的消息或2)保存消息并在应用程序重新启动时处理它们(通常通过持久队列的JMQ完成) – AngerClown 2012-03-28 13:21:00

+0

我还是不太理解你的问题@Jim。你可以编辑问题,并更精确?你提供关机代码,但也许你的问题是你的后台任务根本没有运行? – Gray 2012-03-28 13:23:35

1

要明确等到所有正在运行的任务完成后,做这样的事情:

try { 
    // Wait for one second indefinitively 
    while (!scheduler.awaitTermination (1, TimeUnit.SECONDS)) { 
    // wait until completion 
    } 
} catch (final InterruptedException ex) { 
    // interrupted... you may log something 
} 
相关问题