JMX服务器和JConsole无法连接

时间:2014-02-03 17:15:57

标签: java jmx

我有一个启用JMX的应用程序,通过执行以下操作创建RMI注册表:

rmiRegistry = LocateRegistry.createRegistry(registryPort);

然后通过执行以下操作创建JMXConnectorServer

JMXServiceURL url = new JMXServiceURL(
      "service:jmx:rmi://localhost:" + serverPort 
      + "/jndi/rmi://:" + registryPort + "/jmxrmi");

connector = JMXConnectorServerFactory.newJMXConnectorServer(
                    url, 
                    null,
                    ManagementFactory.getPlatformMBeanServer());
connector.start();

我的问题是我无法使用JConsole从远程主机连接到此JMX Server。我已按照调试/跟踪JConsole的说明进行操作,我可以看到问题是JConsole尝试连接到必须从注册表获取的虚假IP地址。好吧,它并不完全是假的,因为它碰巧对应于我在JMX Server主机上的虚拟网络接口。 JMX究竟如何选择它?

我的应用程序上的netstat显示serverPortregistryPort都绑定在通配符接口上(在IP4和IP6上),这是预期的,因为我没有&#39 ; t提供套接字工厂。基本连接适用于远程主机,即我可以通过 telnet测试传递两个端口。

我原以为我必须改变本地主机'在JMXServiceURL中我的主机名称(正如其他主机看到的那样,而不是它看到的方式),但这并没有帮助。

做什么用?

UPDATE1

经过一番调查后,我非常确定这个虚假的IP地址'因为RMI只选择它在自己的主机上找到的第一个IP,然后将其作为其“回叫我”#39;地址。然后碰巧找到该主机上存在的虚拟NIC。那真的不想要我想要的。我希望能够明确控制RMI' call-me-back'地址。

1 个答案:

答案 0 :(得分:1)

欢迎来到RMI地狱。

结束点自行解决并发送回jconsole ip使用。

如果您可以尝试使用JMXMP:http://meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/

您还可以尝试java.rmi.server.hostname: http://docs.oracle.com/javase/7/docs/platform/rmi/spec/rmi-properties2.html