【问题标题】:JMX server and JConsole cannot connectJMX 服务器和 JConsole 无法连接
【发布时间】:2014-02-03 17:15:57
【问题描述】:

我有一个启用 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 服务器。我已经按照调试/跟踪 JConsole 的说明进行操作,我可以看到问题在于 JConsole 试图连接到它必须从注册表获得的虚假 IP 地址。好的,它并不完全是伪造的,因为它恰好对应于我在 JMX Server 主机上的虚拟网络接口。 JMX 到底是如何做到这一点的?

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

我会假设我必须将 JMXServiceURL 中的 'localhost' 更改为我的主机名(因为其他主机看到它,而不是它看到自己的方式)但这没有帮助。

做什么?

更新1

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

【问题讨论】:

    标签: java jmx


    【解决方案1】:

    欢迎来到 RMI 地狱。

    端点自行解析并将ip发回jconsole使用。

    如果您可以尝试使用 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

    【讨论】:

    • 好吧,通过阅读这些文档,似乎很难准确控制随对象导出的 IP/主机名。我试过使用java.rmi.server.hostname,但它似乎只对文档调用的内容有影响 out-of-the-box-setup 但我的更像是一个 DIY(注册表是手动创建的,connectorserver是手动创建的,等等)。
    • 我发现this 在某种程度上是一样的。基本问题是相同的,即如何控制 RMI 使用的“call-me-back”地址。该问题中公认的答案是摆弄主机文件。这是不行的!
    • 可以使用 System.setProperty(key, value) 在您的代码中设置任何系统属性。我经常将它用于 java.awt.headless。但请注意在加载任何使用它的类之前设置它。
    • 是的,设置java.rmi.server.hostname 就是答案。我刚开始做错了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2016-07-15
    相关资源
    最近更新 更多