2009-12-01 5 views
3

ServletContextListener 인터페이스를 구현하는 Initializer 클래스가 있습니다. 그 contextInitialized() 메서드에서 파괴 해야하는 일부 전역 클래스를 초기화합니다. 그렇지 않으면 서블릿을 언로드 할 수 없습니다.init()이 실패한 경우 servlet 다음을 정리하십시오.

그러나, 서블릿의 init() 방법은은, 결코 호출되지 가져옵니다 contextDestroyed() 방법은 ServletException가 발생하는 경우 -> 자원이 해제되지 않습니다 -> 서블릿은 Tomcat에서 언로드되지 않습니다 (는 "실행"상태 심지어 init을하지만 남아 방법은 끝나지 않았다).

제 질문은 -이 경우 자원을 어떻게 정리합니까?

보너스 : 서블릿이 "실행 중"상태가되는 이유는 무엇입니까? the documentation에서 init() 메서드가 성공적으로 완료되지 않으면 실행 중이 아님을 알고 있습니다.

편집 - 저는 이것이 Tomcat Manager에 표시되는 각 상태 표시 줄이 전체 전쟁을 나타내며 서블릿이 아니기 때문이라고 생각합니다. 전쟁에는 서블릿이 여러 개 포함될 수 있으며 일부는 시작하는 데 성공하고 다른 일부는 시작할 수 없습니다. Initializer은 컨테이너가 시작될 때 호출되며 컨테이너 전체가 삭제 된 경우에만 destroy가 호출됩니다. 이것은 관련된 질문으로 이어진다. 개별 서블릿의 상태를 모니터링하는 비슷한 내장 된 방법이 있는가?

(저는 JMX를 통해 서블릿을 모니터링하기 위해 사용자 정의 코드를 작성할 수 있다는 것을 알고 있습니다. 그러나이 메시지는 의 범위를 벗어납니다.)

답변

1

내가 말할 수있는 한, 외부 요청 없이는 그렇게 할 수있는 방법이 없다는 것입니다. ServletContextListener는 올바른 서블릿이 초기화되었을 때 올바른 신호를 제공하지만 관련된 ServletContext 메소드가 사용되지 않아 빈 열거자를 반환하기 때문에 모든 서블릿을 컨텍스트에서 열거하여 상태를 테스트 할 수 없습니다.

요약하면 이렇게하는 유일한 방법은 비표준 API를 사용하는 것입니다. 특히 권장할만한 Tomcat의 JMX API를 사용하는 것이 거의 쉽지 않습니다.

+0

[ServletContextListener] (http://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/ServletContextListener.)의 javadoc에 따르면.html), contextInitialized 메소드는 메소드 이름의 과거 시제가 당신을 믿을 수있게하는 것과는 달리 "웹 애플리케이션의 모든 필터 또는 서블릿이 초기화되기 전에"구동됩니다. –

1

현실 세계에서는 init()이 절대로 실패하지 않아야합니다. 실패하면 개발자가 고쳐야 할 프로그래밍 오류입니다. 앱 서버 웹 컨테이너는 아무 관계가 없습니다. 서블릿은 단순히 사용할 수 없도록 유지됩니다.

+0

프로그래밍 오류가 아니라 구성/배포 오류입니다. 그러면 서블릿의 상태를 어떻게 모니터 할 수 있습니까? – ripper234

+0

구성 오류는 여전히 귀하의 책임입니다. 모니터링은 로그를 읽음으로써 수행 할 수 있습니다. – BalusC

+0

나는 이것이 어떻게 관련되는지 보지 못한다. 운영 담당자가 모니터링하는 부분은 컨테이너 상태입니다. 우리는 그것이 _servlet_ 상태를 나타내는 것이라고 생각했지만 그럴만 한 것은 아닙니다. 남아있는 유일한 질문은 Tomcat이 모든 서블릿을 시작하지 못한 경우 컨테이너를 중지해야하는지 여부입니다. – ripper234

0

실행중인 컨테이너는 무엇입니까?

예를 들어 Tomcat은 JMX을 지원합니다. 자신 만의 JMX-beans를 작성할 수 있습니다.

+0

Tomcat, 내가 질문에 언급했듯이. 이것을 모니터링하기 위해 사용자 정의 (JMX 또는 not) 코드를 작성할 수 있음을 알고 있지만,이 질문의 범위를 벗어납니다. 준비가 된 솔루션이 있는지 알고 싶었습니다. – ripper234

관련 문제