2013-12-07 3 views
1

Tomcat 7.0.8에 webapp가 배포되었습니다. 최근에는 쿼츠 스케줄러에서 호출되는 몇 가지 작업을 모니터링 할 수 있도록 MBeans를 구현하기 시작했습니다. JConsole을 사용하여 Tomcat의 MBean 서버에 연결하고 JNDI를 통해 데이터베이스에 연결을 시도하는 메소드를 호출합니다.JMX를 통해 연결할 때 Tomcat에서 JNDI 컨텍스트 초기화가 실패합니다

실행은 다음과 같은 예외가 발생 Context initContext = new InitialContext();에 도달하면 :

는 javax.naming.NoInitialContextException : 클래스를 인스턴스화 할 수 없습니다 org.apache.naming.java.javaURLContextFactory [루트 예외가 java.lang.ClassNotFoundException가이다 : org.apache.naming.java.javaURLContextFactory]

메소드가 일반 서블릿 (JAX-WS 웹 서비스)에서 호출 될 때 클래스로드에 문제가 없습니다. JMX가 관련되어있을 때 클래스 로딩이 다르게 작동하는 것으로 보이지만 어떻게 될지 알 수 없습니다 ... RMI class loader disabled과 관련이 있으며 JConsole에서 알려줍니다.

답변

0

예. 실제로는 조금 더 복잡합니다. 당신은 Web Container에 익숙하지만 JMX MBeans는 다른 컨테이너에서 실행됩니다 (수명주기가 별도 임). 그것이 MBeanServer입니다.

The MBeanServer

+0

OK, web.xml/server.xml에 정의 된 JNDI 리소스에 연결할 수 없다는 의미입니까? 리소스를 정의하는 다른 방법이 없으므로 구현 코드를 변경하지 않고도 JNDI 데이터 소스에 연결할 수 있습니다. –

+0

외부 [레지스트리 서비스] (http://docs.oracle.com/javase/1.5.0/docs/guide/jndi/jndi-rmi.html)를 사용하십시오. –

0

정적 변수 (문맥에서 고개) 나는 문맥이 시작하는 동안 가능한 것을 깨달았다, 그래서 ServletContextListener이 데이터 소스를 막아 냈습니다. 내 응용 프로그램이 데이터베이스 연결을 요청하면 저장된 데이터 소스에서 검색됩니다.

0

이 문제의 또 다른 해결 방법은 Context initContext = new InitialContext(); 코드가 포함 된 클래스의 클래스 로더를 검색하고 스레드의 현재 클래스 로더로 설정합니다.

이것은 JMX 콘솔에서 메소드 호출을 할 때 클래스로드 문제와 관련하여 저에게 효과적입니다.