无法通过Java6中的jconsole连接到Tomcat的MBeanServer

时间:2009-04-13 08:20:17

标签: java tomcat jmx administration

我在远景机器上。我已经使用以下选项启动了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

它无法连接。有什么想法吗?

5 个答案:

答案 0 :(得分:4)

在Ubuntu 10.04上,使用OpenJDK 6和Tomcat 6.0.29,无论有多少 com.sun.management.jmxremote。* 选项,我无法为本地jconsole会话激活JMX使用CATALINA_OPTS传递给java。问题是 -Djava.io.tmpdir 设置,默认为 $ CATALINA_BASE / temp 。我只需要设置:

CATALINA_TMPDIR="/tmp"

bin / catalina.sh 的开头,我能够在本地连接jconsole,jmap,jps等。不需要任何 com.sun.management.jmxremote 。* 设置。

答案 1 :(得分:4)

好吧,我原则上认为op给出的URL是错误的但事实并非如此。所以我无法回答。

不过,以下是基础知识:

通过jconsole进行简单连接。

如果您知道您要连接的JMX服务器具有例如9003的 RMI注册表端口,请使用

连接
localhost:9003

代替。

否则,这是我从头开始发现的:

假设您使用“RMI REGISTRY PORT”中的 RMI注册表端口在“TARGET MACHINE”上运行JMX Server(别名'JMX Agent'别名'您要连接的JVM')和'JMX RMI SERVER PORT'上的 JMX RMI服务器端口

注意:

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

    service:jmx:rmi://<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi

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

    此URI是RFC2609“服务位置协议URL”(嗯,它确实是一个URI,对吗?)

    它由:

    组成
    • service - 常数
    • jmx:rmi - 服务类型由以下内容组成:抽象类型 jmx网址计划 {{1} }
    • 其余 - sap (服务访问协议规范)

    sap 被分解为:

    • rmi - ipsite
    • //<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT> - 网址

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

    网址分解为:

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

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

    在搔头之后,直观地说,试试吧:

    jmxrmi

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

    service:jmx:rmi://<TARGET_MACHINE>/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi

    更好的是,这也有效!

    参考文献:

    service:jmx:rmi:///jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi

答案 2 :(得分:1)

流程是否在同一个用户下运行?

您还可以通过运行jps和jconsole(两者都在JDK_HOME / bin目录中)进行检查

答案 3 :(得分:0)

这也是OS X 10.7又名Lion的需要。

答案 4 :(得分:0)

我在这里回答了类似的问题:java.rmi.ConnectException: Connection refused to host: 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=A.B.C.D"  #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=A.B.C.D