我正在尝试为自定义监控Web应用程序的Zookeeper实例构建JMX Java客户端。如文件Zookeeper provides various statistics through JMX MBeans中所述。
对于练习,我使用以下参数在Windows 7 Enterprise上以独立模式在本地运行Zookeeper intance: -
-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 intance后,我能够使用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 ticket似乎在说有两种端口可以发挥作用 - jmx port&里米港。 rmi端口是随机生成的。我想这是创建连接时所需要的。
但是JConsole如何能够连接?
更新2
此blog表示通过RMI协议与远程JMX服务器通信可能存在问题,建议使用JMXMP(JMX-Messaging Protocol)。 现在我该如何做到这一点?