Задача фонового таймера в веб-приложении JSP/Servlet
Я хочу получать из подписки и хранить каналы в БД из подписки каждые 6 часов. Я хочу иметь поток таймера в фоновом режиме для выполнения этой задачи.
Какой лучший способ? Обычный поток таймера или API Quartz?
Ответ 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() метод
Класс UpdateSubscriptions должен реализовать Runnable, и фактическое задание должно выполняться в run(), который вы @Override, как в примере в связанный ответ.