我在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告诉我什么?
答案 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。
答案 2 :(得分:0)
我意识到上下文在启动时是可用的,所以我在静态变量中保存了数据源(从上下文中查找)ServletContextListener
。当我的应用程序请求数据库连接时,将从存储的数据源中检索它。