@PreDestroy не вызывается для Spring-компонента в области сеанса при отключении tomcat - PullRequest
6 голосов
/ 01 марта 2011

Использование Spring 3.0.5 GA

Иметь бин Session-scoped с методом @PreDestroy.Только что заметил, что если время владения HttpSession истекло (то есть превысило значение времени ожидания сеанса контейнера сервлета), то будет выполнен обратный вызов @PreDestroy.Однако, если я просто выключу сервер приложений, @PreDestroy не будет вызван.Это дизайн или ошибка?Если последнее, какие-либо предложения для обходного пути?

FWIW, @PreDestroy на одноэлементных компонентах вызывается в обоих случаях.

спасибо, -nikita

PS.Возможно, связана ошибка Spring - SPR-7359

Ответы [ 2 ]

6 голосов
/ 01 марта 2011

Интересно.EJB-объектам сессионной области вызывается @Predestroy, когда происходит событие закрытия сеанса.Если контейнер никогда не отправляет это событие, Spring не будет проинформирован.Я не уверен, является ли это ошибкой или нет, и если да, то когда это ошибка в Spring или Tomcat.Последнее кажется более вероятным, но я не знаю, обязан ли это делать контейнер сервлетов.

Если для вас это ограничитель показа, вы можете подумать о том, чтобы bean-объект scoped зарегистрировался всинглтон-регистратор во время его @PostConstruct и отмена регистрации на @PreDestroy.Если регистратор выключен, он может распространить это событие на все оставшиеся сессионные компоненты, все еще зарегистрированные в нем.

Не идеальное, но прагматичное решение.

2 голосов
/ 01 марта 2011

Я бы догадался, что это так.

Например, Tomcat сохраняет свои сессии в SESSIONS.ser по умолчанию для каждого развернутого приложения. Если вы выключите Tomcat и перезапустите его, он перечитает SESSIONS.ser. Таким образом, я бы предположил, что в отношении Spring закрытие контейнера не обязательно означает завершение сеанса, так что это означает, что методы @PreDestroy не вызываются на bean-объектах сессионной области.

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