Ответ 1
Вы можете использовать ServletContextListener
, чтобы выполнить некоторую инициализацию при запуске webapp. Стандартный метод Java API для запуска периодических задач будет представлять собой комбинацию Timer
и TimerTask
. Вот пример запуска:
public void contextInitialized(ServletContextEvent event) {
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new CleanDBTask(), 0, oneHourInMillis);
timer.scheduleAtFixedRate(new StatisticsTask(), 0, oneQuartInMillis);
}
где обе задачи могут выглядеть так:
public class CleanDBTask extends TimerTask {
public void run() {
// Implement.
}
}
Использование Timer
, однако, не рекомендуется в Java EE. Если задача генерирует исключение, то весь поток Timer
будет убит, и вам нужно будет перезагрузить весь сервер, чтобы он снова запустился. Timer
также чувствителен к изменениям в системных часах.
Более новый и более надежный способ java.util.concurrent
был бы комбинацией ScheduledExecutorService
и просто Runnable
. Вот пример запуска:
private ScheduledExecutorService scheduler;
public void contextInitialized(ServletContextEvent event) {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new CleanDBTask(), 0, 1, TimeUnit.HOURS);
scheduler.scheduleAtFixedRate(new StatisticsTask(), 0, 15, TimeUnit.MINUTES);
}
public void contextDestroyed(ServletContextEvent event) {
scheduler.shutdownNow();
}