8

我已按照以下链接中的说明在 tomcat 内的单个端口上创建自己的 RMI 注册表和 jmx 服务器。根据评论,我需要设置-Djava.rmi.server.hostname=localhost。一旦我这样做了,我确实可以使用 ssh 端口转发通过 jconsole 连接到我的服务器。

http://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx

但是,我发现它具有破坏使用 RMI 的 ehcache 复制的非常糟糕的副作用。它无法抱怨它无法从远程对等 localhost 引导。我猜是因为对等方都通过设置-Djava.rmi.server.hostname=localhost 将他们的rmi 服务器主机名设置为localhost。

有没有人可以解决这个问题?

4

3 回答 3

1

对不起,但我的第一个答案是错误的。但我认为使用 tomcat6 你可以选择 JmxRemoteLifecycleListener:

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.

http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.html

于 2011-02-01T08:16:40.673 回答
1

如果您正在寻找一种易于使用、防火墙友好的 JMX 远程处理替代方案,那么 jmx4perl可能值得一试。它是一种基于代理的方法,通过 HTTP/Rest 导出 JMX MBean。

虽然它的主要重点是在脚本环境(即 perl)中用于监控目的,但对于预定的 0.70 版本,已经添加了一个 Java 客户端库(beta 质量)

于 2010-06-04T20:39:17.470 回答
1

我刚刚遇到了这个问题。问题是 java.rmi.servername.hostname 属性是全局的。为了使 ehcache 和 jmx 服务器协调运行,您必须在运行 VisualVM 的机器上执行一些 hack。

这是你需要做的。这是基于使用 Mac 作为客户端,因此根据需要修改命令。

  1. 删除 -Djava.rmi.server.hostname=localhost。

  2. 编写一个测试器应用程序,它将在您要分析的服务器计算机上为您提供 InetAddress.getLocalHost().getHostAddress() 的值。这应该为您提供本地 ip(如果 nat'd 则为私有)。您必须在本地计算机上引用此 IP。在下面的命令说 IP 的地方使用这个 IP。

  3. 现在,这是有趣的部分:将内部 IP 添加到您机器上的环回接口。(ifconfig lo0 IP 网络掩码 255.255.255.0 向上)

  4. 测试这实际上会将流量引导到环回。它应该返回环回。(路由获取IP)

  5. 启动 SSH 隧道:ssh -C -L IP:PORT:localhost:PORT -L IP:OTHER_PORT:localhost:OTHER_PORT user@host。

请注意,ssh 隧道的 IP 实际上是现在绑定到环回的 IP。您不再指代本地主机,而是指机器的 IP。您还必须修改 JMX URL 以引用此 IP 而不是 localhost。

于 2010-05-19T01:06:28.707 回答