Подтвердить что ты не робот

Выполнение периодической задачи на стороне сервера для веб-сайта JSP MVC

Я разработал веб-приложение, используя сервлет и JSP. Я не использую какую-либо структуру как таковую, вместо этого использую собственную собственную среду MVC. Я использую MySQL как бэкэнд.

Я хочу сделать следующее:

  • Каждый час очищать данные от базы данных
  • Создавать и хранить статистику о данных каждые 15 минут в XML файле где-то

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

Как выполнять периодические задачи на стороне сервера?

Одно из решений, которое я имею прямо сейчас, - это создать поток в функции инициализации контроллера. Есть ли другие варианты?

4b9b3361

Ответ 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();
}

Ответ 2

вы можете использовать любой расписание для планирования вашего процесса, например, кварца, spring scheduler

http://static.springsource.org/spring/docs/2.5.x/reference/scheduling.html  имеет хорошую поддержку для этих продуктов с любой реализацией.