barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 21 марта 2012 г.

Выполнение периодических задач в сервлете

Чтобы выполнять какой-то код в сервлете периодически, с момента инициализации сервлета и до окончания его жизненного цикла, нужно сделать следующее (на примере Tomcat 6):
1) Добавить в веб-приложении класс, реализующий интерфейс ServletContextListener:
package example;

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");
}
}
Чтобы методы этого класса contextInitialized и contextDestroyed вызывались, соответственно, при инициализации и уничтожении контекста веб-приложения, необходимо добавить в web.xml внутрь тега web-app следующее:
<listener>
  <listener-class>
  example.ServletContextExample
  </listener-class>
</listener>
2)  Теперь можно воспользоваться классом ScheduledExecutorService для вызова необходимой периодической задачи (задача должна быть заключена в класс, реализующий интерфейс Runnable). Для этого в методе contextInitialized нужно инициализировать ScheduledExecutorService, а в contextDestroyed - корректно завершить его работу:
package example;

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();
}
}
В данном примере метод MyRunnableImpl.run() будет выполняться раз в час.

Использованы материалы с javabeat.net и stackoverflow.com.

Комментариев нет:

Отправить комментарий