Stop scheduled timer when shutdown tomcat [duplicate]

Do not use Timer in an Java EE environment! If the task throws a runtime exception, then the whole Timer is killed and won’t run anymore. You basically needs to restart the whole server to get it to run again. Also, it is sensitive to changes in the system clock.

Use ScheduledExecutorService instead. It’s not sensitive to exceptions thrown in tasks nor to changes in system clock. You can shutdown it by its shutdownNow() method.

Here’s an example of how the entire ServletContextListener implementation can look like (note: no registration in web.xml required thanks to the new @WebListener annotation):

@WebListener
public class BackgroundJobManager implements ServletContextListener {

    private ScheduledExecutorService scheduler;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new YourParsingJob(), 0, 5, TimeUnit.HOUR);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        scheduler.shutdownNow();
    }

}

Leave a Comment