ServletContextListener
인터페이스를 구현하는 Initializer
클래스가 있습니다. 그 contextInitialized()
메서드에서 파괴 해야하는 일부 전역 클래스를 초기화합니다. 그렇지 않으면 서블릿을 언로드 할 수 없습니다.init()이 실패한 경우 servlet 다음을 정리하십시오.
그러나, 서블릿의 init()
방법은은, 결코 호출되지 가져옵니다 contextDestroyed()
방법은 ServletException
가 발생하는 경우 -> 자원이 해제되지 않습니다 -> 서블릿은 Tomcat에서 언로드되지 않습니다 (는 "실행"상태 심지어 init
을하지만 남아 방법은 끝나지 않았다).
제 질문은 -이 경우 자원을 어떻게 정리합니까?
보너스 : 서블릿이 "실행 중"상태가되는 이유는 무엇입니까? the documentation에서 init()
메서드가 성공적으로 완료되지 않으면 실행 중이 아님을 알고 있습니다.
편집 - 저는 이것이 Tomcat Manager에 표시되는 각 상태 표시 줄이 전체 전쟁을 나타내며 서블릿이 아니기 때문이라고 생각합니다. 전쟁에는 서블릿이 여러 개 포함될 수 있으며 일부는 시작하는 데 성공하고 다른 일부는 시작할 수 없습니다. Initializer
은 컨테이너가 시작될 때 호출되며 컨테이너 전체가 삭제 된 경우에만 destroy가 호출됩니다. 이것은 관련된 질문으로 이어진다. 개별 서블릿의 상태를 모니터링하는 비슷한 내장 된 방법이 있는가?
(저는 JMX를 통해 서블릿을 모니터링하기 위해 사용자 정의 코드를 작성할 수 있다는 것을 알고 있습니다. 그러나이 메시지는 의 범위를 벗어납니다.)
[ServletContextListener] (http://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/ServletContextListener.)의 javadoc에 따르면.html), contextInitialized 메소드는 메소드 이름의 과거 시제가 당신을 믿을 수있게하는 것과는 달리 "웹 애플리케이션의 모든 필터 또는 서블릿이 초기화되기 전에"구동됩니다. –