我在远程主机上有一个tomcat应用程序,需要通过JConsole连接它.申请以params开头:
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
Run Code Online (Sandbox Code Playgroud)
端口9999打开,IP值有效,我查了一下.我可以通过telnet(telnet <my_host> <my_port>)访问它.用netstat:
netstat -a | grep LISTEN
tcp 0 0 *:9999 *:* LISTEN
Run Code Online (Sandbox Code Playgroud)
但是我无法通过jconsole连接它,我总是得到同样的错误:
Connection Failed: Retry?
Run Code Online (Sandbox Code Playgroud)
但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
Run Code Online (Sandbox Code Playgroud)
我还试图添加文件.../conf/remote.users,.../remote.acl并在prorerties中写入文件-Dcom.sun.management.jmxremote.password.file,-Dcom.sun.management.jmxremote.access.file但它没有任何效果.
当我在本地计算机上部署此应用程序时,我可以连接到它 "localhost:9999"
帮助某人,可能是什么问题?
如果你能够telnet <my_host> <my_port>然后问题必须是因为防火墙,因为在JMX中一旦在配置端口上完成握手,即然后分配新端口进行进一步通信,可能你的Firwall不允许打开新端口.
要进行交叉检查,只需尝试在Java JMX Client下运行,它将尝试显示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();
}
}
Run Code Online (Sandbox Code Playgroud)
启用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
Run Code Online (Sandbox Code Playgroud)
编译java代码并使用下面的命令运行
java -Djava.util.logging.config.file=./logging.properties JMXDemo
Run Code Online (Sandbox Code Playgroud)
这将在控制台上打印这么多日志,你可以grep"port".
| 归档时间: |
|
| 查看次数: |
5667 次 |
| 最近记录: |