2013-09-23 3 views
0

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

Update

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

Я только что увидел, что если я брошу невольное исключение в свою работу, 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 
     } 
    } 
} 

Конец StackTrace будет:

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

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

+2

... и третий, чтобы убедиться, что сторожевой все еще работает. Следовательно, сторонние библиотеки расписания. –

+0

Не совсем понимаю ваш вопрос, но в случае, если вы хотите создать задачу расписания, верните это http://stackoverflow.com/questions/5357033/background-timer-task-in-jsp-servlet-web-application – lent

+1

Никогда больше никогда используйте «Таймер» в предположительно пожизненном приложении Java EE! См. Также нижнюю часть этого ответа: http://stackoverflow.com/questions/15787605/how-to-run-a-background-job-method-at-fixed-intervals/15789574#15789574 – BalusC

ответ

2

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

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

try{ 
     doRun(); 
    }catch (RuntimeException e){ 
     logger.error("Uncaught Runtime Exception",e); 
     return; // Keep working 
    }catch (Throwable e){ 
     logger.error("Unrecoverable error",e); 
     throw e; 
    } 
+0

Спасибо ... Я только что увидел что, если я бросаю невольное исключение в свою работу, TimerThread перестает работать вечно. Также был отмечен также комментарий BalusC. –