2

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

它不会连接。有任何想法吗 ?

4

5 回答 5

6

好的,我原本以为 op 给出的 URL 是错误的,但事实证明不是。所以我无法回答。

不过,这里是基础知识:

通过jconsole.

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

localhost:9003

反而。

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

假设您在“目标机器”上运行 JMX 服务器(别名“JMX 代理”别名“您要连接的 JVM”),RMI 注册表端口位于“RMI REGISTRY PORT”,JMX RMI 服务器端口位于“JMX RMI”服务器端口'。

笔记:

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

以下 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-服务类型由:抽象类型 jmxURL方案组成 rmi
  • 其余的 - sap(服务访问协议规范)

树液分解为:

  • //<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>- ipsite
  • /jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi- 网址部分

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

URL部分分解为:

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

这有点先入为主,因为必须先联系SLP URL后半部分给出的RMI 注册表。

挠头之后,直观地,让我们尝试一下:

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

是的,这行得通!JMX RMI 服务器端口很好地从注册表中获得。再三考虑,目标机器也应该从注册表中获得,因此:

service:jmx:rmi:///jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/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
于 2011-08-10T20:21:18.530 回答
4

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

CATALINA_TMPDIR="/tmp"

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

于 2010-12-03T10:31:35.653 回答
1

Are the processes run under the same user?

You can also check by running jps and jconsole (both in the JDK_HOME/bin directory)

于 2009-04-14T10:34:20.870 回答
0

OS X 10.7 aka Lion 也需要此功能。

于 2011-08-09T19:45:17.277 回答
0

我在这里回答了一个类似的问题:java.rmi.ConnectException: Connection denied 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 地址,并在例如 catalina.sh 脚本中指定 IP 地址时使用该 IP 地址:

-Djava.rmi.server.hostname=A.B.C.D
于 2014-03-06T14:38:07.770 回答