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

этот вопрос уже есть ответ здесь:

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

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

1 ответов


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

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

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

или когда вы уже на контейнере Java EE 6, который поддерживает EJB 3.1 (JBoss как 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 часов, используйте пример, приведенный в beforelinked ответ и сделайте следующее изменение в scheduleAtFixedRate() метод

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

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