我已按照以下链接中的说明在tomcat内的单个端口上创建自己的RMI注册表和jmx服务器。根据评论,我需要设置-Djava.rmi.server.hostname = localhost。一旦我这样做,我确实可以通过使用ssh端口转发的jconsole连接到我的服务器。
http://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx
但是,我发现它破坏了使用RMI的ehcache复制的非常糟糕的副作用。它无法抱怨它无法从远程对等localhost引导。我猜是因为对等体都将其rmi服务器主机名设置为localhost,设置为-Djava.rmi.server.hostname = localhost。
有没有人可以解决此问题?
答案 0 :(得分:1)
我刚刚遇到了这个问题。问题是java.rmi.servername.hostname属性是全局的。要使ehcache和jmx服务器协调运行,您必须在运行VisualVM的计算机上执行一些操作。
这是你需要做的。这是基于为客户端使用Mac,因此根据需要修改命令。
删除-Djava.rmi.server.hostname = localhost。
编写一个测试器应用程序,它将为您提供要分析的服务器计算机上的InetAddress.getLocalHost()。getHostAddress()的值。这应该给你本地的IP(私人如果nat'd)。您必须在本地计算机上引用此IP。使用此IP,其中以下命令表示IP。
现在,这是有趣的部分:将内部IP添加到计算机上的环回接口。 (ifconfig lo0 IP netmask 255.255.255.0 up)
测试这实际上会将流量引导到环回。它应该返回环回。 (路线获取IP)
启动SSH隧道:ssh -C -L IP:PORT:localhost:PORT -L IP:OTHER_PORT:localhost:OTHER_PORT user @ host。
请注意,ssh隧道的IP实际上是现在与环回绑定的IP。您不再引用localhost,而是引用机器的IP。您还必须修改JMX URL以引用此IP而不是localhost。
答案 1 :(得分:1)
如果您寻找易于使用,防火墙友好的JMX远程处理替代方案,jmx4perl可能值得一试。它是一种基于代理的方法,通过HTTP / Rest导出JMX MBean。
虽然其主要重点是用于脚本环境(即perl)以用于监视目的,但对于预定版本0.70,已添加Java客户端库(测试版质量)
答案 2 :(得分:1)
public boolean getUseLocalPorts() Get the flag that indicates that local ports should be used for all connections. If using SSH tunnels, or similar, this should be set to true to ensure the RMI client uses the tunnel.