我尝试通过添加 JVM args 在服务器上运行的 Java 应用程序上启用 JMX 远程处理-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9001 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
,但无法连接到该应用程序。不知道应用程序是否以某种方式搞乱了它,我编写了一个简单的测试应用程序:
public class Main {
public static void main(String[] args) {
while (true) {
try {
System.out.println("Sleeping for 5 seconds...");
Thread.sleep(5000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
但是,我也无法连接到该应用程序。iptables 显示 9001 上有一个开放端口,netstat 确认已建立连接,但 Jconsole(和一个简单的 Groovy 脚本)由于超时而失败。
由于到目前为止我的故障排除都失败了,我一直在寻找让 Jconsole 连接的其他方法。解决方案包括安装新的 Web 服务器并通过它路由 JMX,但这对我来说可能不可行。盒子上有一个 Web 服务器,但它是 Hiawatha,我无法更改它或安装另一个。我错过了什么?
答案1
尝试以下步骤进行故障排除并报告:
您可以
telnet xxx.xxx.xxx.xxx 9001
从运行 jconsole 的地方使用它。您应该看到:连接到 xxx.xxx.xxx.xxx 转义字符为 '^]'。
如果您确实看到了,那么这意味着您有一个 TCP 连接,因此防火墙不是问题。
在服务器上运行以下命令并发布输出:
$ netstat -an | grep 收听 | grep 9001 tcp6 0 0 :::9001 :::* 监听
你的课程和命令行:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9001 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false Main
对我来说工作正常,我可以连接到 jconsole。
- 您能否检查一下您要监控的主机正在运行哪个版本的Java?
java -version