Извикване на метод при премахване на разгръщането от уеб приложение на Java

Разработвам уеб приложение на Java. Приложението се свързва с индекс на Lucene. Създавам единичен екземпляр на IndexSearcher. Този екземпляр отваря някои файлове. Когато преразпределя уеб приложението, файловете, отворени от по-ранния екземпляр на IndexSearcher, продължават да остават отворени и друг екземпляр се създава от преразпределеното приложение. След няколко преразпределения системата започва да хвърля изключение „твърде много отворени файлове“. Бих искал да затворя стария екземпляр преди повторно разполагане, така че старите файлове да бъдат затворени, но не мога да разбера как да направя това? Има ли директива в web.xml, която се извиква при un-deploy, подобно на load-on-startup? Изпълнявам уеб приложението на jboss сървър.


person Shashank Agarwal    schedule 18.11.2011    source източник


Отговори (2)


Внедрете 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>
person BalusC    schedule 18.11.2011
comment
Тук работи без да го регистрирате. Използване на Mojarra 2.3.3 на Payara 4.1 (173 компилация). - person Roland; 05.11.2017
comment
Разбира се, че ще работи добре. Payara 4.x е базиран на Servlet 3.1. Тогава @WebListener ще работи добре. Както беше отговорено, няма да работи, когато все още не сте на Servlet 3.0. JSF impl/version е без значение, тъй като не играе роля тук. Уместна е само версията на Servlet. - person BalusC; 05.11.2017

Ако внедрите javax.servlet.ServletContextListener и регистрирате този клас в web.xml като <listener>, тогава методът contextDestroyed() ще бъде извикан, преди контекстът да бъде разтоварен.

person Ramon    schedule 18.11.2011