По каким причинам TimerTask может перестать работать в сервлете Tomcat

Я подозреваю, что исключение может привести к тому, что TimerTask перестанет работать, и в этом случае мне, скорее всего, понадобится второй timetask, чтобы контролировать, что первый все еще работает?

Обновить

Спасибо за ответы. Я унаследовал этот код, поэтому немного невежествен...

Я только что увидел, что если я создам неперехваченное исключение в своей работе, TimerThread перестанет работать навсегда.

Метод запуска TimerThread показал, что если возникает исключение, мой запланированный поток больше никогда не запускается.

public void run() {
    try {
        mainLoop();
    } finally {
        // Someone killed this Thread, behave as if Timer cancelled
        synchronized(queue) {
            newTasksMayBeScheduled = false;
            queue.clear();  // Eliminate obsolete references
        }
    }
}

Конец трассировки стека будет таким:

at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)

Таким образом, временное решение состоит в том, чтобы поймать ВСЕ... более долгосрочное решение состоит в том, чтобы перейти к лучшему планированию, как утверждает BalusC.


person Menelaos    schedule 23.09.2013    source источник
comment
... и третий, чтобы убедиться, что сторожевой таймер все еще работает. Следовательно, сторонние библиотеки планирования.   -  person Dave Newton    schedule 23.09.2013
comment
Не совсем понимаю ваш вопрос, но если вы хотите создать задачу по расписанию, обратитесь к этому stackoverflow.com/questions/5357033/   -  person Casper Ngo    schedule 23.09.2013
comment
Никогда, никогда, никогда, никогда не используйте Timer в предположительно долго работающем приложении Java EE! См. также нижнюю часть этого ответа: «как запустить метод фонового задания через фиксированные интервалы»> stackoverflow.com/questions/15787605/   -  person BalusC    schedule 23.09.2013


Ответы (1)


TimerTasks умирают, когда генерируется необработанное исключение (независимо от того, работает ли оно в tomcat или нет). Самый простой способ решить эту проблему - поймать RuntimeException в вашем методе запуска, а также зарегистрировать и продолжить, если вы этого хотите.

Также рекомендуется перехватывать Throwables и регистрировать их перед повторным вызовом, чтобы вы могли видеть трассировку стека в своих журналах, например:

    try{
        doRun();
    }catch (RuntimeException e){
        logger.error("Uncaught Runtime Exception",e);
        return; // Keep working
    }catch (Throwable e){
        logger.error("Unrecoverable error",e);
        throw e;
    }
person Enno Shioji    schedule 23.09.2013
comment
Спасибо ... Я только что увидел, что если я создам неперехваченное исключение в своей работе, TimerThread перестанет работать навсегда. Также комментарий BalusC был на высоте. - person Menelaos; 23.09.2013