gpt4 book ai didi

java - 无法连接到远程 JMX

转载 作者:搜寻专家 更新时间:2023-10-31 19:37:26 26 4
gpt4 key购买 nike

我在远程主机上有一个 tomcat 应用程序,需要通过 JConsole 连接它。应用程序以参数开头:

IP=`ifconfig eth0 | grep 'inet addr:' | cut -d ':' -f2 | cut -d ' ' -f1`

-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=$IP
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

端口 9999 已打开,IP值是有效的,我检查过。我可以通过 telnet ( telnet <my_host> <my_port> ) 访问它。网络统计:

netstat -a | grep LISTEN
tcp 0 0 *:9999 *:* LISTEN

但我无法通过 jconsole 连接它,我总是得到同样的错误:

Connection Failed: Retry?

但是netstat -a显示连接是ESTABLISHED

我尝试了不同的地址:

<my_host>:<my_port>

service:jmx:rmi://<my_host>:<my_port>/jndi/rmi://<my_host>:<my_port>/jmxrmi

service:jmx:rmi:///jndi/rmi://<my_host>:<my_port>/jmxrmi

我还尝试添加文件 .../conf/remote.users.../remote.acl并在属性中写入该文件的路径 -Dcom.sun.management.jmxremote.password.file-Dcom.sun.management.jmxremote.access.file但是没有效果。

当我在我的本地机器上部署这个应用程序时,我可以在 "localhost:9999" 连接到它

求助,请问是什么问题?

最佳答案

如果你能telnet <my_host> <my_port>那么问题一定是因为防火墙,因为在 JMX 中,一旦在配置的端口上完成握手,即分配一个新端口用于进一步通信,并且可能您的防火墙不允许打开新端口。

要交叉检查,只需尝试在 Java JMX 客户端下运行,它将尝试显示 HeapMemoryUsage。

import java.util.Set;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class JMXDemo {

private static final String HOST = ""; // configure host <my_host> here
private static final String PORT = ""; // configure port <my_port> here

private static void testJMX() throws Exception {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://" + HOST + "/jndi/rmi://" + HOST + ":" + PORT
+ "/jmxrmi");

JMXConnector jmxConnector = JMXConnectorFactory.connect(url);
try {
MBeanServerConnection mbeanServerConnection = jmxConnector.getMBeanServerConnection();

ObjectName mbeanName = new ObjectName("java.lang:type=Memory");
javax.management.openmbean.CompositeDataSupport obj = null;

obj = (javax.management.openmbean.CompositeDataSupport) mbeanServerConnection.getAttribute(mbeanName,
"HeapMemoryUsage");
Set<String> keySet = obj.getCompositeType().keySet();

for (String key : keySet) {
System.out.print(key + "=" + obj.get(key) + ", ");
}
} finally {
jmxConnector.close();
}
System.out.println("\n==========================");
}

public static void main(String args[]) throws Exception {
testJMX();
}

}

启用 JMX 日志记录创建一个 logging.properties 文件

handlers= java.util.logging.ConsoleHandler
.level=ALL

java.util.logging.FileHandler.pattern = jmx.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

// Use FINER or FINEST for javax.management.remote.level - FINEST is
// very verbose...
//
javax.management.level=FINEST
javax.management.remote.level=FINEST

java.security.debug=all

编译java代码并使用下面的命令运行

 java -Djava.util.logging.config.file=./logging.properties JMXDemo 

这会在控制台打印很多日志,你可以grep "port"。

关于java - 无法连接到远程 JMX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35982953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com