【问题标题】:Explain JMX URL解释 JMX URL
【发布时间】:2011-02-15 14:54:12
【问题描述】:

我正在尝试了解 JMX 服务 URL。

service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi

如果有人能帮助我理解这一点,那就太好了。

谢谢

【问题讨论】:

标签: java jmx


【解决方案1】:

解释一下:

service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi
  1. service:jmx:rmi://192.168.30.10:1234 - 表示机器上有一个 IP 地址为 192.168.30.10 的 JMX 代理。 JMX 代理使用 (TCP) 端口 1234 通过 RMI 提供 JMX 服务(基本上充当 RMI 服务器)。
  2. /jndi/rmi://192.168.30.10:2344/jmxrmi - 表示通过 RMI 与 JMX 代理交互的 RMI 存根可以在 RMI 注册表中找到,该注册表在 IP 地址为 192.168.30.10 的机器上运行并使用 (TCP) 端口 2344。获取 RMI 存根您需要查找“jmxrmi”绑定。

以前的答案表明URL的第二部分是获取JMX RMI服务器的服务器端口。这是不正确的。 JMX RMI 服务器端口是 (TCP) 1234,是 URL 的一部分。您从 RMI 注册表中获得的是 RMI 存根 (javax.management.remote.rmi.RMIServerImpl_Stub),您可以使用它通过 RMI 与 JMX 代理(MBean 服务器)通信。

希望这会有所帮助。

【讨论】:

  • 既然您说@david-tonhofer 的答案不正确,您能否解释一下没有第一个IP:端口对(本例中为192.168.30.10:1234)的URL 是如何工作的?即,以service:jmx:rmi:///jndi/rmi: 开头的 URL。这通常令人困惑的部分原因是,当我们在启动 JVM 时指定 jmx 端口时,它不会在任何地方引用 RMI:-Dcom.sun.management.jmxremote.port=2344。 (请注意,根据我的经验,jmxremote 端口与 URL 的“RMI Registry”部分相关联,而不是“JMX RMI Server”部分。)
  • 有多种方法可以指定 JMX 代理将使用的 IP 和端口。如果您希望将其修复为特定的 IP 和地址,您可以使用service:jmx:rmi://192.168.30.10:1234。或者,您可以使用 com.sun.management.— 属性。使用诸如service:jmx:rmi:///… 之类的 URL 让 Java 为您选择 IP 和端口(随机或基于系统属性)。使用service:jmx:rmi://0.0.0.0:1234 等URL 绑定所有接口上的1234 端口。等等。希望这会有所帮助。
【解决方案2】:

我将重复使用我之前为这个问题写的答案:Cannot connect to Tomcat's MBeanServer via jconsole in Java6

它不完整,但可能会有所帮助:

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

注意:

  1. RMI 注册表 告诉 JMX 客户端在哪里可以找到 JMX RMI 服务器端口;信息可以在密钥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(服务访问协议规范)

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. http://download.oracle.com/javase/6/docs/api/javax/management/remote/rmi/package-summary.html
  2. http://download.oracle.com/javase/6/docs/api/javax/management/remote/JMXServiceURL.html
  3. http://mx4j.sourceforge.net/docs/ch03s04.html
  4. http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdevg
  5. http://www.rfc-editor.org/rfc/rfc2609.txt

【讨论】:

    【解决方案3】:

    根据javax.management.remote.rmi

    这个url是这样组装的

    service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
    

    【讨论】:

    • 我认为他在问为什么它需要如此复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 2017-01-11
    相关资源
    最近更新 更多