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

Задача фонового таймера в веб-приложении JSP/Servlet

Я хочу получать из подписки и хранить каналы в БД из подписки каждые 6 часов. Я хочу иметь поток таймера в фоновом режиме для выполнения этой задачи.

Какой лучший способ? Обычный поток таймера или API Quartz?

4b9b3361

Ответ 1

Чтобы начать, я бы не использовал JSP для этого. Там это не для.

Когда вы работаете на Java EE 5, используйте для этого API-интерфейсы, связанные с контейнером. Дополнительная информация зависит от используемого вами контейнера. JBoss AS 5, например, корабли с кварцем из коробки. Или, когда вы используете фреймворк поверх JSP/Servlet, который предлагает API-интерфейсы для работы с заданиями, например Spring, вы должны использовать его.

Если их нет (например, вы используете только Tomcat 6) или хотите быть независимыми от контейнера и/или фреймворка, создайте ServletContextListener с ScheduledExecutorService. Более подробную информацию можно найти в этом ответе.

Или, когда вы уже находитесь на контейнере Java EE 6, который поддерживает EJB 3.1 (JBoss AS 6, GlassFish 3, но, таким образом, не Tomcat 7), проще всего создать @Singleton EJB с @Schedule.

@Singleton
public class UpdateSubscriptions {

    @Schedule(hour="*/6", minute="0", second="0", persistent=false)
    public void run() {
        // Do your job here.
    }

}        

Что это. Никакой дополнительной конфигурации не требуется.


Обновить: в соответствии с комментариями вы используете Tomcat (6 или 7?). Чтобы запустить поток во время запуска webapp, который запускает задачу каждые 6 часов, используйте пример, представленный в перед отбором ответа, и внесите следующие изменения в scheduleAtFixedRate() метод

scheduler.scheduleAtFixedRate(new UpdateSubscriptions(), 0, 6, TimeUnit.HOURS);

Класс UpdateSubscriptions должен реализовать Runnable, и фактическое задание должно выполняться в run(), который вы @Override, как в примере в связанный ответ.