Чтобы выполнять какой-то код в сервлете периодически, с момента инициализации сервлета и до окончания его жизненного цикла, нужно сделать следующее (на примере Tomcat 6):
1) Добавить в веб-приложении класс, реализующий интерфейс ServletContextListener:
package example;Чтобы методы этого класса contextInitialized и contextDestroyed вызывались, соответственно, при инициализации и уничтожении контекста веб-приложения, необходимо добавить в web.xml внутрь тега web-app следующее:
public class ServletContextExample implements ServletContextListener{
public void contextInitialized(ServletContextEvent contextEvent) {
System.out.println("Context Created");
}
public void contextDestroyed(ServletContextEvent contextEvent) {
System.out.println("Context Destroyed");
}
}
<listener>2) Теперь можно воспользоваться классом ScheduledExecutorService для вызова необходимой периодической задачи (задача должна быть заключена в класс, реализующий интерфейс Runnable). Для этого в методе contextInitialized нужно инициализировать ScheduledExecutorService, а в contextDestroyed - корректно завершить его работу:
<listener-class>
example.ServletContextExample
</listener-class>
</listener>
package example;В данном примере метод MyRunnableImpl.run() будет выполняться раз в час.
public class ServletContextExample implements ServletContextListener{
private ScheduledExecutorService scheduler;
public void contextInitialized(ServletContextEvent contextEvent) {
System.out.println("Context Created");
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new MyRunnableImpl(), 0, 1, TimeUnit.HOURS);
}
public void contextDestroyed(ServletContextEvent contextEvent) {
System.out.println("Context Destroyed");
scheduler.shutdown();
}
}
Использованы материалы с javabeat.net и stackoverflow.com.
Комментариев нет:
Отправить комментарий