Нам нужно длительное задание, которое периодически выполняет какой-то асинхронный метод c, оно выглядит следующим образом:
Timer t = new Timer();
t.schedule(new TimerTask() {
public void run() {
try {
new RunnableImpl().run();
} catch (Exception e) {
logger.error("Exception," , e);
}
}
}, 0, this.scanInterval * 1000L);
Однако я проверил журналы сервера и обнаружил, что таймерная задача перестала выполняться на несколько часов после запуска без зарегистрированных исключений. Как это возможно?
Иногда наш метод .run () вызывает исключение, которое я вижу в журналах. Это не приводит к тому, что поток d ie, и код просто запускается снова на следующей итерации. Поэтому очень плохо, что приложение внезапно умирает без журнала.
Сегодня утром я снова начал работу и проверил использование процессора и памяти, они оба стабильны и не очень высоки, использование процессора составляет 6,5% и 1.7% использования памяти без каких-либо закономерностей увеличения или скачка.
Выдает ли код что-то, что не может быть перехвачено «catch Exception e», как какая-то ошибка во время выполнения? Я думаю, что это все еще должно быть поймано и зарегистрировано. Должен ли я рассмотреть другой подход, такой как ScheduledExecutorService?