无法通过Java6中的jconsole连接到Tomcat的MBeanServer
我在远景机器上。 我已经使用以下选项启动了tomcat 5.5.27:
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=9003 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false"
当我通过jconsole连接并添加以下服务URL
service:jmx:rmi:///jndi/rmi://localhost:9003/jmxrmi
它不会连接。 有任何想法吗 ?
在Ubuntu 10.04上,使用OpenJDK 6和Tomcat 6.0.29,我无法为本地jconsole会话激活JMX,无论我使用CATALINA_OPTS传递给java的com.sun.management.jmxremote。*选项有多少。 问题是-Djava.io.tmpdir设置,默认为$ CATALINA_BASE / temp 。 我只需要设置:
CATALINA_TMPDIR="/tmp"
在bin / catalina.sh的开头,我能够在本地连接jconsole,jmap,jps等。根本不需要任何com.sun.management.jmxremote。*设置。
好吧,我原则上认为op给出的URL是错误的但事实并非如此。 所以我无法回答。
不过,以下是基础知识:
通过jconsole
进行简单连接。
如果您知道要连接的JMX服务器的RMI注册表端口为9003,请使用连接
localhost:9003
代替。
否则,这是我从头开始发现的:
假设您在’TARGET MACHINE’上运行JMX服务器(别名’JMX代理’别名’您要连接的JVM’), RMI注册表端口位于’RMI REGISTRY PORT’, JMX RMI服务器端口位于’JMX RMI’服务器端口’。
注意:
- RMI注册表告诉JMX客户端在哪里可以找到JMX RMI服务器端口 ; 可以在密钥
jmxrmi
下获得信息。 - RMI注册表端口通常是已知的,因为它是通过JVM启动时的系统属性设置的。
- JMX RMI服务器端口通常不知道,因为JVM随机选择它(如果不采取其他预防措施)。
以下URI将导致成功(已测试)
service:jmx:rmi://
这看起来很讨厌。 让我们把它分开。
这个URI是一个RFC2609“服务位置协议URL”(嗯,它真的是一个URI,对吧?)
它由以下部分组成:
-
service
– 一个常数 -
jmx:rmi
– 由以下组成的服务类型 : 抽象类型jmx
和URL方案rmi
- 其余的 – 闷棍 (服务访问协议规范)
sap被分解为:
-
//
– ipsite: -
/jndi/rmi://
– URL部分: /jmxrmi
一个消息灵通的JMX客户端连接到“ipsite”以进行JMX-over-RMI交换; 但是什么JMX客户端不知道该端口? 忍耐…
URL部分被分解为:
-
/jndi/
– 这似乎告诉JMX客户端它可以在后面的位置获取查找信息 -
rmi://
– 是的,我们在查找键: /jmxrmi jmxrmi
下的RMI注册表中获取有关JMX RMI服务器的信息
这有点像马车,因为必须首先联系SLP URL 后半部分给出的RMI注册表 。
抓住头后,直观地说,让我们试试:
service:jmx:rmi://
是的,那很有效! 从注册表中很好地获得了JMX RMI服务器端口。 再想一想, 目标机器也应该从注册表中获取,因此:
service:jmx:rmi:///jndi/rmi://
更好的是,这也有效!
参考文献:
1 download.oracle.com/javase/6/docs/api/javax/management/remote/rmi/package-summary.html 2 download.oracle.com/javase/6/docs/api/javax/management/remote/JMXServiceURL.html 3 mx4j.sourceforge.net/docs/ch03s04.html 4 download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdevg 5 http://www.rfc-editor.org/rfc/rfc2609.txt
流程是否在同一个用户下运行?
您还可以通过运行jps和jconsole(两者都在JDK_HOME / bin目录中)进行检查
这也是OS X 10.7又名Lion的需要。
我在这里回答了类似的问题: java.rmi.ConnectException:Connection拒绝主机:127.0.1.1;
我发现了很多关于这个主题的问答,并没有什么能帮助我 – 那是因为我的问题更基本(我能说什么我不是网络大师:))。 我在/ etc / hosts中的IP地址不正确。 我尝试过的包括CATALINA_OPTS的以下内容:
CATALINA_OPTS="$CATALINA_OPTS -Djava.awt.headless=true -Xmx128M -server -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=ABCD" #howeverI put the wrong ip here! export CATALINA_OPTS
我的问题是我在几个月前更改了我的IP地址,但从未更新我的/ etc / hosts文件。 似乎默认情况下,即使我正在查看本地进程,jconsole也会以某种方式使用主机名-i ip地址。 最好的解决方案是简单地更改/ etc / hosts文件。
可以工作的另一个解决方案是从/ sbin / ifconfig获取正确的IP地址,并在指定IP地址时使用该IP地址,例如,catalina.sh脚本:
-Djava.rmi.server.hostname=ABCD