Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JMX服务器和JConsole无法连接_Java_Jmx - Fatal编程技术网

Java JMX服务器和JConsole无法连接

Java JMX服务器和JConsole无法连接,java,jmx,Java,Jmx,我有一个启用JMX的应用程序,它通过以下操作创建RMI注册表: rmiRegistry = LocateRegistry.createRegistry(registryPort); JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi://localhost:" + serverPort + "/jndi/rmi://:" + registryPort + "/jmxrmi"); connector = JM

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

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

connector = JMXConnectorServerFactory.newJMXConnectorServer(
                    url, 
                    null,
                    ManagementFactory.getPlatformMBeanServer());
connector.start();
然后,它通过执行以下操作创建:

rmiRegistry = LocateRegistry.createRegistry(registryPort);
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服务器主机上拥有的虚拟网络接口。JMX究竟是如何获取这些信息的

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

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

你做什么

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

欢迎来到RMI地狱

端点自行解析并将要使用的ip发送回jconsole

如果您可以尝试使用JMXMP:

您也可以尝试java.rmi.server.hostname:

从阅读这些文档中,似乎很难准确控制随对象导出的IP/主机名。我尝试过使用
java.rmi.server.hostname
,但它似乎只对文档中所谓的开箱即用的设置有影响,但我的设置更像是DIY(注册表是手动创建的,connectorserver是手动创建的,等等)。我发现这在某种程度上是相同的。基本问题也是如此,即如何控制RMI使用的“回拨”地址。这个问题的公认答案是修改hosts文件。那是不可能的!可以使用system.setProperty(键、值)在代码中设置任何系统属性。我经常在java.awt.headless中使用它。但是注意在加载任何使用它的类之前设置它。是的,设置
java.rmi.server.hostname
就是答案。刚开始我做得不对。谢谢