通过JMX连接时,Tomcat中的JNDI上下文初始化失败

时间:2013-12-07 21:38:27

标签: java tomcat jndi jmx jconsole

我在Tomcat 7.0.8中部署了一个webapp。最近我开始实现MBeans,以便能够监视一些通常从石英调度程序调用的操作。我使用JConsole连接到Tomcat的MBean服务器并调用一个方法,该方法尝试通过JNDI连接到数据库。

执行到达时 Context initContext = new InitialContext();抛出以下异常:

  

javax.naming.NoInitialContextException:无法实例化类:org.apache.naming.java.javaURLContextFactory [根异常是java.lang.ClassNotFoundException:org.apache.naming.java.javaURLContextFactory] ​​

当从常规servlet(JAX-WS Web服务)调用该方法时,类加载没有问题。当涉及JMX时,类加载似乎有所不同,但我无法弄清楚...它是否与RMI class loader disabled有关,JConsole告诉我什么?

3 个答案:

答案 0 :(得分:1)

此类问题的另一种解决方法:检索包含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控制台进行方法调用时,这对我来说是有问题的。

答案 1 :(得分:0)

是。它实际上比那复杂一点;你已经习惯了Web Container - 但JMX MBeans在不同的容器中运行(具有独立的生命周期)。那是MBeanServer

The MBeanServer

答案 2 :(得分:0)

我意识到上下文在启动时是可用的,所以我在静态变量中保存了数据源(从上下文中查找)ServletContextListener。当我的应用程序请求数据库连接时,将从存储的数据源中检索它。