无法通过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’服务器端口’。

注意:

  1. RMI注册表告诉JMX客户端在哪里可以找到JMX RMI服务器端口 ; 可以在密钥jmxrmi下获得信息。
  2. RMI注册表端口通常是已知的,因为它是通过JVM启动时的系统属性设置的。
  3. JMX RMI服务器端口通常知道,因为JVM随机选择它(如果不采取其他预防措施)。

以下URI将导致成功(已测试)

service:jmx:rmi://:/jndi/rmi://:/jmxrmi

这看起来很讨厌。 让我们把它分开。

这个URI是一个RFC2609“服务位置协议URL”(嗯,它真的是一个URI,对吧?)

它由以下部分组成:

  • service – 一个常数
  • jmx:rmi – 由以下组成的服务类型抽象类型 jmxURL方案 rmi
  • 其余的 – 闷棍 (服务访问协议规范)

sap被分解为:

  • //: – ipsite
  • /jndi/rmi://:/jmxrmi – URL部分

一个消息灵通的JMX客户端连接到“ipsite”以进行JMX-over-RMI交换; 但是什么JMX客户端不知道该端口? 忍耐…

URL部分被分解为:

  • /jndi/ – 这似乎告诉JMX客户端它可以在后面的位置获取查找信息
  • rmi://:/jmxrmi – 是的,我们在查找键jmxrmi下的RMI注册表中获取有关JMX RMI服务器的信息

这有点像马车,因为必须首先联系SLP URL 后半部分给出的RMI注册表

抓住头后,直观地说,让我们试试:

service:jmx:rmi:///jndi/rmi://:/jmxrmi

是的,那很有效! 从注册表中很好地获得了JMX RMI服务器端口。 再想一想, 目标机器也应该从注册表中获取,因此:

service:jmx:rmi:///jndi/rmi://:/jmxrmi

更好的是,这也有效!

参考文献:

 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