即使捕获了所有异常,ScheduledExecutorService也会停止工作

时间:2015-07-31 15:26:49

标签: java java.util.concurrent

我已将ScheduledExecutorService设置为每分钟执行一次。我的命令捕获所有异常以防止执行程序服务停止工作。但是,出于某种原因,它有时会停止工作(让我们说每隔几天一次,可能是应用程序有更多流量)。

我的方法启动执行程序服务:

public void startExecutor(ScheduledExecutorService executor) {
   Runnable job = new Runnable() {
        @Override
        public void run() {
            doJob();
        }
    };
    executor.scheduleAtFixedRate(job, 0, 1, TimeUnit.MINUTES);
}

ScheduledExecutorService由Dropwizard以这种方式初始化:

@Override
public void run(NuvrProjectsAndRecordingsConfiguration configuration, Environment environment) throws Exception {
    ScheduledExecutorService executor = environment.lifecycle().scheduledExecutorService("job").build();
}

Dropwizard创建ScheduledThreadPoolExecutor实施,corePoolSize等于1。

doJob()方法捕获所有异常:

private void doJob() {
    try {
        worker.process();
    } catch (Exception e) {
        LOGGER.error("Cannot perform job, will retry", e);
    }
}

process()方法处理常规异常,并且finally部分:

public void process() {
    try {
        // some hard stuff
    } catch (IOException ex) {
        LOGGER.error("Processing of job failed", ex);
    } catch (RuntimeException e) {
        LOGGER.error("Unknown error during recording processor", e);
    } finally {
        // clean after processing
    }
}

有趣的是,有时会从finally部分抛出异常。

由于所有操作都受全局catch-exception部分保护 - 为什么执行程序服务停止工作?

1 个答案:

答案 0 :(得分:0)

您可能需要捕获所有Throwable,因为Exception类不包含子类Error。