Explain JMX URL

90

我正在尝试理解一个JMX服务的URL。

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

如果有人能帮我理解这个问题,那就太好了。

谢谢。


与http://stackoverflow.com/questions/743343/cannot-connect-to-tomcats-mbeanserver-via-jconsole-in-java6相关。 - Gray
3个回答

116

我将重用之前回答此问题的答案:无法通过Java6中的jconsole连接到Tomcat的MBeanServer

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

假设您在“目标机器”上运行具有“RMI注册表端口”为“RMI注册表端口”和“JMX RMI服务器端口”为“JMX RMI服务器端口”的JMX服务器(别名“JMX代理”别名“要连接的JVM”)。

注意:

  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 - URL部分

了解情况的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. 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
  6. 这些链接涉及IT技术,具体包括Java远程方法调用、JMX服务URL和代理等主题。其中包含的资源包括Java文档、RFC文件和mx4j文档。

11
为了说明:
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 - 这意味着可以在运行在IP地址为192.168.30.10的计算机上的RMI注册表中找到用于与JMX代理进行 RMI 交互的RMI存根,并且正在使用(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注册表”部分相关联,而不是“JMX RMI服务器”部分。) - erik.weathers
有多种方法可以指定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。 等等。希望这可以帮助你。 - Prolancer

5

5
他在询问为什么事情需要变得如此复杂。 - djangofan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接