Управление закрытием ресурса в контейнере сервлета - PullRequest
3 голосов
/ 15 июня 2010

Я использую Tomcat в качестве контейнера сервлета, и у меня развернуто много WAR.Многие из WAR имеют общие базовые классы, которые реплицируются в каждом контексте из-за разных загрузчиков классов и т. Д.

Как обеспечить очистку ресурса при уничтожении контекста, не подключая каждый файл web.xml для добавленияслушатели контекста?

В идеале, я хотел бы что-то вроде

class MyResourceHolder implements SomeListenerInterface {
    private SomeResource resource;
    {
        SomeContextThingie.registerDestructionListener(this);
    }
    public void onDestroy() { resource.close(); }
}

I мог бы поместить что-то в каждый файл web.xml, но, поскольку естьдля его очистки требуется много WAR-файлов и только те, которые фактически инициализируют ресурс, более естественным является регистрация для очистки при инициализации ресурса, а не дублирование большой части конфигурации XML и затем возможно очистка.

(В данном конкретном случае я инициирую упорядоченное завершение пула соединений SQL. Но я считаю, что это полезно и во многих других ситуациях ...)

Я уверенесть какое-то чертовски очевидное решение, но мой Google-фу сейчас меня подводит.Спасибо!

Ответы [ 3 ]

2 голосов
/ 28 июня 2010

Нет другого возможного варианта, кроме ServletContextListener.

Если вы уже используете Servlet 3.0, вы можете просто аннотировать его с помощью @WebListener, отправить его вместе с веб-приложением, и оно будет автоматически загружено. Но с Servlet 2.5 и старше вам действительно нужно суетиться с web.xml.

1 голос
/ 28 июня 2010

Вы можете поместить ресурсы в совместный загрузчик классов и сделать их доступными в качестве ресурсов JNDI - при этом вы должны быть очень осторожны, чтобы синхронизировать свои приложения, хотя это возможно.

Может зависеть от того, какие ресурсы вы чистите, и какой отток вы ожидаете увидеть в своем API.

Примечание. Проблемы с загрузчиком классов могут быть очень сложными для отладки - «Класс XClass не является экземпляром XClass» может свести вас с ума.

Edit1: Другие варианты: вы можете использовать финализаторы в вашем пуле или другом объекте - это должно позволить вам выполнить код (например, когда веб-приложение выгружается и пул перерабатывается) - это сколько Классы JDK очищают собственные ресурсы. Однако, если вы сделаете это, будьте очень осторожны, так как взаимоблокировка в очереди финализатора заблокирует все виды важной очистки и, вероятно, приведет к сбою вашей JVM, поскольку ничего, что использует финализаторы, не получит gc'd.

0 голосов
/ 03 июля 2010

Переместите пул соединений SQL из веб-приложения в веб-контейнер и получите к нему доступ через JNDI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...