我正在尝试为自定义监控 Web 应用程序的 Zookeeper 实例锻炼 JMX Java 客户端。如文档中所述,Zookeeper 通过 JMX MBeans 提供各种统计信息。
对于练习,我使用以下参数在 Windows 7 Enterprise 上以独立模式在本地运行 Zookeeper 实例:-
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=10010
-Dzookeeper.jmx.log4j.disable=false
运行我的 zookeeper 实例后,我可以使用正确显示所有统计信息的JConsole连接到 JMX bean:-
问题
尝试使用我自己的代码进行连接时 java.net.ConnectException: Connection refused: connect
出现错误。我正在尝试的代码:-
public static void main(String[] args) throws Exception {
// service:jmx:rmi:///jndi/rmi://#{host}:#{port}/jmxrmi
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:10010/jmxrmi");
// This throws java.net.ConnectException !!!
JMXConnector jmxConnector = JMXConnectorFactory.connect(url);
MBeanServerConnection mbeanServerConnection = jmxConnector.getMBeanServerConnection();
ObjectName mbeanName = new ObjectName("org.apache.ZooKeeperService:name0=StandaloneServer_port2181");
ZooKeeperServerMXBean newProxyInstance = MBeanServerInvocationHandler.newProxyInstance(mbeanServerConnection,
mbeanName, ZooKeeperServerMXBean.class, true);
System.out.println("Created zoo mbean proxy");
System.out.println(newProxyInstance.getAvgRequestLatency());
}
尝试使用Java Visual VM连接时遇到同样的问题。
使用 Java 代码连接到 Zookeeper MBean 的正确方法是什么?
更新 1
有 4 年未解决的JIRA 票似乎在说有两种端口可以发挥作用 - jmx 端口和 rmi 端口。rmi 端口是随机生成的,我猜这是创建连接时需要的。
但是 JConsole 是如何连接的呢?
更新 2
该博客说通过 RMI 协议与远程 JMX 服务器通信可能会出现问题,并建议改用 JMXMP(JMX 消息传递协议)。现在我该怎么做呢?