【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
项目需求:通过JMX监控ZooKeeper,效果类似jconsole,但以web方式展现。在使用过程中,web容器中的JMX连接MBeanServer获取连接时,总是失败,提示信息:java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory。但通过main方法调用的时候,是可以正常访问的。
代码如下:
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的获取方式,然后就可以正常运行了,修改后的代码如下:
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上面意思是最好使用第二种方法。
来源:oschina
链接:https://my.oschina.net/u/1241970/blog/730950