我正在尝试理解一个JMX服务的URL。
service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi
如果有人能帮我理解这个问题,那就太好了。
谢谢。
我将重用之前回答此问题的答案:无法通过Java6中的jconsole连接到Tomcat的MBeanServer
它不完整,但可能有所帮助:
假设您在“目标机器”上运行具有“RMI注册表端口”为“RMI注册表端口”和“JMX RMI服务器端口”为“JMX RMI服务器端口”的JMX服务器(别名“JMX代理”别名“要连接的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被分解为:
//<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
更好的是,这也行得通!
参考文献:
service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi
service:jmx:rmi://192.168.30.10:1234
- 这意味着在IP地址为192.168.30.10的计算机上有一个JMX代理。该JMX代理使用(TCP)端口1234来提供通过RMI进行 JMX 服务(基本上充当 RMI 服务器)。/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服务器)通讯。
希望对您有所帮助。
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.weathersservice: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