4

我在 Spring3.1 独立环境下开发。

我正在尝试通过 jconsole 远程连接我的应用程序。它在本地工作,但是当我将我的应用程序部署到 linux 机器中时,它会超时。

我正在使用 Daemon 来运行我的环境。

这是我在 run.sh 脚本中添加的内容:

-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=6969 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
com.mypackage.daemon.FixDaemon

在applicationContext.xml里面:

<context:mbean-server />
<context:mbean-export />

现在在 linux 机器上做了 netstat 这就是我们所看到的:

[root@ logs]# netstat -an | grep 6969
tcp        0      0 :::6969                     :::*                        LISTEN

所以它似乎在听。

但是当我在 jconsole 界面中添加我的 ip:6969 时,我得到连接失败弹出窗口。

知道我在做什么错吗?

谢谢,雷。

4

2 回答 2

6

首先尝试将此选项添加到您的应用程序中:

-Djava.rmi.server.hostname=<ip>

还要记住 jconsole 使用 RMI 进行通信。这意味着 jconsole 首先连接到 ip:6969。然后服务器生成一个随机端口 X,将其传回 jconsole。Jconsole 然后打开另一个到 ip:X 的连接。由于 X 是随机的,因此您无法在防火墙中打开此特定端口。您必须打开所有端口或使用另一个主题的 socks 代理。

于 2012-08-27T13:19:19.917 回答
2
  1. 尝试使用机器上的 telnet 连接到该端口。如果这不成功,通常是因为防火墙丢弃了数据包。您必须与您的网络管理员交谈才能打开该端口。

    注意:您必须打开两个端口。一个用于绑定 RMIRegistry,另一个用于导出 RMI 对象。RMI 通常在随机高端口上导出对象。但这在防火墙环境中不起作用,因此您必须配置导出它的端口。这是通过使用 RMI URL 完成的。

  2. 如果您在 Linux 上运行此程序,则执行一个hostname -i,如果它返回 127.0.0.1 则修复/etc/hosts. JConsole 的常见问题解答条目对此有更多信息。

  3. 我强烈建议的另一个选择是查看不涉及更改防火墙配置但仍通过 HTTP 提供 JMX 好东西的Jolokia 。

于 2012-08-27T16:09:09.213 回答