【问题标题】:Java ScheduledExecutorService stopped some time after servlet initializationJava ScheduledExecutorService 在 servlet 初始化后停止了一段时间
【发布时间】:2016-08-25 08:41:07
【问题描述】:

在我的Tomcat 服务器中实现了一个功能:基本上ScheduledExecutorService 将设置为在HttpServlet 初始化时定期运行任务。代码如下:

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

}

【问题讨论】:

  • 最后一个 doWorkFlow 肯定会终止吗?如果没有,则不会开始新的任务。您可以在 doWorkFlow 之后添加日志记录以检查

标签: java servlets scheduled-tasks


【解决方案1】:

如果我错了,请纠正我:无论在 doWorkFlow 方法中是否有任何未处理的异常,都应始终每 5 分钟记录一次该消息

不,因为the javadoc 明确表示:

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

【讨论】:

  • 是的,除非代码抛出错误而不是异常。
猜你喜欢
  • 2012-12-20
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多