项目需求:经过JMX监控ZooKeeper,效果相似jconsole,但以web方式展示。在使用过程当中,web容器中的JMX链接MBeanServer获取链接时,老是失败,提示信息:java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory。但经过main方法调用的时候,是能够正常访问的。java
代码以下:web
String jmxURL = "service:jmx:rmi:///jndi/rmi://" + ip + ":" + jmxport + "/jmxrmi"; // jmxurl JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); Map<String, String[]> map = new HashMap<String, String[]>(); String[] credentials = new String[] { userName, password }; map.put("jmx.remote.credentials", credentials); connector = JMXConnectorFactory.connect(serviceURL, map); MBeanServerConnection mbsc = connector.getMBeanServerConnection();
后从网上搜索资料,从一篇文章(http://canofy.iteye.com/blog/758748)中获到了解决方法,修改了MBeanServerConnection的获取方式,而后就能够正常运行了,修改后的代码以下:apache
Registry registry = LocateRegistry.getRegistry(host, Integer.parseInt(port)); RMIServer stub = null; if (stub == null) { stub = (RMIServer) registry.lookup("jmxrmi"); } Map<String, String[]> map = new HashMap<String, String[]>(); String[] credentials = new String[] { username, password }; map.put("jmx.remote.credentials", credentials); connector = new RMIConnector(stub, null); connector.connect(map); mbsc = connector.getMBeanServerConnection();
MBeanServerConnection有两种获取方式,通常状况下,两种获取方式均可以,某些特殊应用,API上面意思是最好使用第二种方法。url