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

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

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


person MalTec    schedule 18.03.2011    source источник


Ответы (1)


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

При работе с Java EE 5 используйте для этого предоставленные контейнером API планирования заданий. Дальнейшие подробности зависят от контейнера, который вы используете. Например, JBoss AS 5 поставляется с Quartz из коробки. Или когда вы используете фреймворк поверх 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?). Чтобы запустить поток во время запуска веб-приложения, который запускает задачу каждые 6 часов, используйте пример, приведенный в ответ перед ссылкой и внесите следующие изменения в scheduleAtFixedRate()

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

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

person BalusC    schedule 18.03.2011
comment
+1 не могу получить более совершенный ответ, чем этот. - person asgs; 19.03.2011
comment
Я использую только Tomcat. Я тоже видел связанный ответ. 1. Я намеревался использовать его в классе, crntlt не собирался использовать JSP. Но лучше ли использовать сервлет? 2. если я помещу его в сервлет, как показано в связанном ответе, не будет ли он создавать новый поток каждые 6 часов? - person MalTec; 19.03.2011
comment
Это не сервлет. Это слушатель. И это только один экземпляр за время жизни веб-приложения (кстати, то же самое относится и к сервлетам). - person BalusC; 19.03.2011
comment
Я предполагаю, что вам, возможно, было трудно настроить метод scheduleAtFixedRate(). Я обновил ответ примером, который запускает экземпляр UpdateSubscriptions каждые 6 часов. - person BalusC; 19.03.2011
comment
Используя планировщик EB, вы будете ограничены ограничениями EJB. Следовательно, если вам нужно использовать что-то вроде многопоточного HttpClient, вы не должны делать это с помощью таймера EJB, так как это может привести к тому, что потоки испортятся. - person Allan Lykke Christensen; 14.04.2011