Вызов метода при отмене развертывания из веб-приложения Java - PullRequest
11 голосов
/ 18 ноября 2011

Я занимаюсь разработкой веб-приложения на Java.Приложение подключается к индексу Lucene.Я создаю единственный экземпляр IndexSearcher.Этот экземпляр открывает несколько файлов.При повторном развертывании веб-приложения файлы, открытые более ранним экземпляром IndexSearcher, продолжают оставаться открытыми, и повторно развернутое приложение создает другой экземпляр.После нескольких повторных развертываний система начинает выдавать исключение «слишком много открытых файлов».Я хотел бы закрыть старый экземпляр перед повторным развертыванием, чтобы старые файлы были закрыты, но я не могу понять, как это сделать?Есть ли в web.xml директива, которая вызывается при развертывании, аналогично загрузке при запуске?Я запускаю веб-приложение на сервере jboss.

Ответы [ 2 ]

21 голосов
/ 18 ноября 2011

Реализация ServletContextListener.

@WebListener
public class LuceneConfig implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // Do your job here during webapp startup.
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // Do your job here during webapp shutdown.
    }

}

Если вы еще не используете Servlet 3.0 (хотя уже 2 года нет), вам необходимо удалить аннотацию @WebListener и зарегистрировать ее вручную в web.xml следующим образом:

<listener>
    <listener-class>com.example.LuceneConfig</listener-class>
</listener>
2 голосов
/ 18 ноября 2011

Если вы реализуете javax.servlet.ServletContextListener и регистрируете этот класс в web.xml как <listener>, то метод contextDestroyed() будет вызываться до выгрузки контекста.

...