我已将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部分保护 - 为什么执行程序服务停止工作?
答案 0 :(得分:0)
您可能需要捕获所有Throwable,因为Exception类不包含子类Error。