У меня есть ScheduledExecutorService
, установленный для выполнения каждую минуту. Моя команда ловит все исключения, чтобы предотвратить работу службы-исполнителя. Однако по какой-то причине он иногда перестает работать (скажем, раз в несколько дней, возможно, когда приложение имеет больше трафика).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.
The 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
раздела.
Поскольку все операции защищены глобальной секцией исключения исключений - почему служба-исполнитель перестает работать?
"* Иногда исключение исключается из раздела' finally' * * Что у вас есть в этом блоке? – user1803551