2016-04-30 77 views
0

在我的Tomcat服务器中实现了一项功能:基本上ScheduledExecutorService将设置为在初始化HttpServlet后定期运行任务。代码如下所示:Java ScheduledExecutorService在servlet初始化后停止了一段时间

@Override 
public void init() throws ServletException { 
    HttpsTool.setupUncheckedHttps(); 
    LOGGER.info("DeploymentInfoScheduler Initialized successfully...."); 
    System.out.println("DeploymentInfoScheduler Initialized successfully...."); 
    this.retrieveServiceDeploymentsInfo(); 
} 

private void retrieveServiceDeploymentsInfo() { 
    final Runnable deploymentsDataHandler = new DeploymentsDataHandler(); 
    final ScheduledFuture<?> beeperHandle = deploymentsInfoRetrieverScheduler 
      .scheduleAtFixedRate(deploymentsDataHandler, 0, 5, TimeUnit.MINUTES); 


} 

如果servlet已成功初始化,任务将永远保持每5秒运行一次。在DeploymentsDataHandlerrun方法,消息记录像下面在开始的时候:

@Override 
public void run() { 
    LOGGER.info("Now begin a new round of refreshing deployment data..."); 
    this.doWorkFlow(); 
} 

纠正我,如果我错了:不管是否有任何异常的doWorkFlow方法未处理的,该消息应该总是每5分钟记录一次。但事实是这个调度程序运行良好一段时间,突然停止工作,甚至停止记录消息。任何可能的解释?我怎么能处理这种情况,因为我想确保这个调度程序服务始终运行。或者有什么方法可以调试这个问题?

我假设以下代码将确保Scheduler永不停止执行,即使在doworkFlow发生异常。

@Override 
public void run() { 
    try{ 
     LOGGER.info("Now begin a new round of refreshing deployment data..."); 
     this.doWorkFlow(); 
    }catch(Exception e){ 
     return; 
    } 

} 
+0

最后的doWorkFlow确定终止吗?如果不是,则不会有新的任务开始。您可以在doWorkFlow后添加日志记录来检查 –

回答

2

纠正我,如果我错了:不管是否有任何异常的doWorkFlow方法未处理的,该消息应始终记录每5分钟

没有,因为the javadoc明确地说: :

如果任务的任何执行遇到异常,后续执行被抑制

+0

是的,除非代码抛出错误而不是异常。 –