说明JMX URL


Answers:


106

我将重用我先前为该问题写的答案:无法通过Java6中的jconsole连接到Tomcat的MBeanServer

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

假设您具有在“ TARGET MACHINE”上运行的JMX服务器(别名为“ JMX Agent”别名“您要连接的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 -URL部分

消息灵通的JMX客户端连接到“ ipsite”以进行RMX上的JMX交换。但是不知道该端口的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

7

解释:

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(基本上充当RMI服务器)提供JMX服务。
  2. /jndi/rmi://192.168.30.10:2344/jmxrmi -表示可以在RMI注册表中找到通过RMI与JMX代理进行交互的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:端口对的URL如何工作(192.168.30.10:1234在此示例中)?即以开头的网址service:jmx:rmi:///jndi/rmi:。通常如此令人困惑的部分原因是,当我们在启动JVM时指定jmx端口时,它在任何地方都没有引用RMI :-Dcom.sun.management.jmxremote.port=2344。(请注意,根据我的经验,jmxremote端口与URL的“ RMI Registry”部分相关联,而不与“ JMX RMI Server”部分相关。)
erik.weathers

有很多方法可以指定JMX代理将使用的IP和端口。如果您希望将其修复为特定的IP和地址,则可以使用service:jmx:rmi://192.168.30.10:1234。或者,您可以使用com.sun.management.—属性。使用URL,例如service:jmx:rmi:///…让Java为您选择IP和端口(随机或基于系统属性)。使用URL,例如service:jmx:rmi://0.0.0.0:1234在所有接口上绑定端口1234。等等。希望这可以帮助。
Prolancer

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.