2013-12-07 5 views
1

У меня есть webapp, развернутый в Tomcat 7.0.8. Недавно я начал внедрять MBeans, чтобы иметь возможность отслеживать несколько действий, которые обычно вызывается из планировщика кварца. Я подключаюсь к серверу MBean Tomcat с помощью JConsole и вызывается метод, который пытается подключиться к базе данных через JNDI.Инициализация контекста JNDI терпит неудачу в Tomcat при подключении через JMX

Когда выполнение достигает Context initContext = new InitialContext(); следующее исключение брошено:

javax.naming.NoInitialContextException: Невозможно создать класс: org.apache.naming.java.javaURLContextFactory исключение [Корень java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory]

Когда метод вызывается из обычного сервлета (а JAX-WS WebService), нет никаких проблем с загрузкой классов. Кажется, загрузка классов работает по-разному, когда задействован JMX, но я не могу понять, как ... Может это что-то связано с RMI class loader disabled, что мне говорит JConsole?

ответ

0

Да. На самом деле это немного сложнее; вы привыкли к Web Container - но JMX MBeans запускаются в другом контейнере (с отдельным жизненным циклом). Это MBeanServer.

The MBeanServer

+0

ОК, означает ли это, что я не могу достичь каких-либо ресурсов JNDI, определенных в файле web.xml/server.xml? Есть ли другой способ определить ресурсы, чтобы я, не меняя код реализации, мог получить источник данных JNDI? –

+0

Используйте внешнюю [службу реестра] (http://docs.oracle.com/javase/1.5.0/docs/guide/jndi/jndi-rmi.html). –

0

я понял, что контекст был доступен во время запуска, так что я сделал ServletContextListener сохранить источник данных (оторвалась от контекста) в статической переменной. Когда мое приложение запрашивает соединение с базой данных, оно извлекается из хранимого источника данных.

0

Другой способ обхода такого рода проблем: получить загрузчик классов для класса, содержащего ваш код Context initContext = new InitialContext();, и установить его как текущий загрузчик классов для потока.

ClassLoader origLoader = Thread.currentThread().getContextClassLoader(); 
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); 
InitialContext ctx = new InitialContext(); 
Object obj = ctx.lookup("java:global/some/path"); 
Thread.currentThread().setContextClassLoader(origLoader); 

Это работало для меня при проблемах с загрузкой классов при выполнении вызовов методов с консоли JMX.

 Смежные вопросы

  • Нет связанных вопросов^_^