Java TimerTask.run () неожиданно завершил работу - PullRequest
0 голосов
/ 09 марта 2020

Нам нужно длительное задание, которое периодически выполняет какой-то асинхронный метод 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?

...