好的,我原本以为 op 给出的 URL 是错误的,但事实证明不是。所以我无法回答。
不过,这里是基础知识:
通过jconsole 进行简单连接。
如果您知道您要连接的 JMX 服务器的 RMI 注册端口位于 9003,例如,使用连接
localhost:9003
改为。
否则,这是我从头开始发现的:
假设您有 JMX 服务器(别名“JMX 代理”别名“您要连接的 JVM”)在“目标机器”上运行,RMI 注册表端口位于“RMI REGISTRY PORT”以及位于“JMX RMI SERVER PORT”的 JMX RMI 服务器端口。
注意:
-
RMI 注册表 告诉 JMX 客户端在哪里可以找到 JMX RMI 服务器端口;信息可以在密钥
jmxrmi下获取。
-
RMI 注册端口通常是众所周知的,因为它是在 JVM 启动时通过系统属性设置的。
-
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 - 服务类型 由:抽象类型 jmx 和 URL 方案 rmi
- 其余部分 - sap(服务访问协议规范)
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 注册表中的查找键 jmxrmi 下获得有关 JMX RMI 服务器的信息
这有点像本末倒置,因为必须首先联系 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