Package javax.management.remote.rmi
RMI连接器是JMX Remote API的连接器,它使用RMI将客户端请求传输到远程MBean服务器。 此包定义了RMI连接器的用户需要为客户端和服务器端直接引用的类。 它还定义了用户通常不会直接引用的某些类,但必须对其进行定义,以便RMI连接器的不同实现可以互操作。
RMI连接器支持RMI的JRMP传输。
与JMX Remote API中的大多数连接器一样,RMI连接器通常具有地址,即JMXServiceURL
。 对于使用默认RMI传输(JRMP)的连接器,此地址的协议部分为rmi
。
RMI连接器地址有两种形式:
- 在JNDI表单中 ,URL指示在何处查找连接器的RMI存根 。 此RMI存根是
RMIServer
类型的Java对象,可以远程访问连接器服务器。 使用此地址表单,可以从URL中包含的外部目录条目获取RMI存根。 外部目录是JNDI
可识别的任何目录,通常是RMI注册表,LDAP或COS命名。 - 在编码形式中 ,URL直接包括连接到连接器服务器所需的信息。 使用RMI / JRMP时,编码形式是服务器对象的序列化RMI存根,使用没有嵌入换行符的BASE64编码。
地址将在下面详细介绍。
创建RMI连接器服务器
创建RMI连接器服务器的常用方法是为方法JMXConnectorServerFactory.newJMXConnectorServer
提供RMI连接器地址。 可以将连接器服务器所连接的MBean服务器指定为该方法的参数。 或者,可以将连接器服务器注册为该MBean服务器中的MBean。
还可以通过显式或通过MBean服务器的createMBean
方法构造RMIConnectorServer
的实例来创建RMI连接器服务器。
选择RMI运输
您可以通过指定选择RMI传输rmi
在protocol
的一部分serviceURL
创建连接器服务器时。 您还可以通过实例化适当的子类RMIServerImpl
并将其提供给RMIConnectorServer
构造函数来创建专用的连接器服务器。
Connector addresses generated by the server
如果您指定的serviceURL
具有空URL路径(在可选主机和端口之后),或者如果未指定serviceURL
,则连接器服务器将JMXServiceURL
客户端可用于连接的新JMXServiceURL
:
如果
serviceURL
看起来像:service:jmx:rmi://host:port
然后连接器服务器将生成
RMIJRMPServerImpl
,返回的JMXServiceURL
如下所示:service:jmx:rmi://host:port/stub/XXXX
其中
XXXX
是生成对象的存根的序列化形式,在没有换行符的BASE64中编码。如果没有
serviceURL
,则必须有用户提供的RMIServerImpl
。 连接器服务器将生成一个JMXServiceURL
使用rmi
形式。
所述host
在用户提供的serviceURL
是可选的。 如果存在,则将其复制到生成的JMXServiceURL
,否则将被忽略。 如果不存在,生成的JXMServiceURL
将具有本地主机名。
所述port
在用户提供的serviceURL
也是可选的。 如果存在,它也被复制到生成的JMXServiceURL
; 否则,生成的JMXServiceURL
没有端口。 对于serviceURL
使用rmi
协议中, port
,如果存在,则指示哪个端口所生成的远程对象应导出上。 它没有其他影响。
如果用户提供RMIServerImpl
而不是JMXServiceURL
,则生成的JMXServiceURL
将在其host
部分中具有本地主机名,而不是port
。
Connector addresses based on directory entries
作为刚刚描述的生成地址的替代,创建连接器服务器时提供的serviceURL
地址可以指定用于存储提供或生成的RMIServer
存根的目录地址 。 然后,客户端和服务器都使用此目录地址。
在这种情况下, serviceURL
具有以下形式:
service:jmx:rmi://host:port/jndi/jndi-name
jndi-name
是一个可以提供给javax.naming.InitialContext.bind
的字符串。
像往常一样,可以省略host
和:port
。
连接器服务器将生成一个RMIServerImpl
基于所述协议( rmi
)和port
如果有的话。 启动连接器服务器时,它将使用其toStub
方法从此对象派生存根,并使用给定的jndi-name
存储对象。 像往常一样参考JNDI API定义的属性。
例如,如果JMXServiceURL
是:
service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
然后连接器服务器将生成一个RMIJRMPServerImpl
并使用JNDI名称存储其存根
rmi://myhost/myname
这意味着进入myname
在主机的默认端口上运行的RMI注册表myhost
。
请注意,RMI注册表仅允许从本地主机进行注册。
因此,在这种情况下, myhost
必须是运行连接器服务器的主机的名称(或名称)。
在此JMXServiceURL
,第一个rmi:
指定RMI连接器,而第二个rmi:
指定RMI注册表。
再举一个例子,如果JMXServiceURL
是:
service:jmx:rmi://ignoredhost/jndi/ldap://dirhost:9999/cn=this,ou=that
然后连接器服务器将生成一个RMIJRMPServerImpl
并使用JNDI名称存储其存根
ldap://dirhost:9999/cn=this,ou=that
这意味着进入cn=this,ou=that
在主机的端口9999上运行的LDAP目录dirhost
。
如果JMXServiceURL
是:
service:jmx:rmi://ignoredhost/jndi/cn=this,ou=that
然后连接器服务器将生成一个RMIJRMPServerImpl
并使用JNDI名称存储其存根
cn=this,ou=that
要使此情况起作用,必须已正确配置JNDI API以提供有关要使用的目录的信息。
在这些示例中,连接器服务器或其客户端未使用主机名ignoredhost
。 它可以省略,例如:
service:jmx:rmi:///jndi/cn=this,ou=that
但是,最好使用运行连接器服务器的主机的名称。 这通常与目录主机的名称不同。
Connector服务器属性
当使用默认的JRMP传输方式,RMI套接字工厂可以使用属性来指定jmx.remote.rmi.client.socket.factory
和jmx.remote.rmi.server.socket.factory
在environment
给予RMIConnectorServer
构造。 这些属性的值必须分别为RMIClientSocketFactory
和RMIServerSocketFactory
。 在创建与连接器关联的RMI对象时使用这些工厂。
创建RMI连接器客户端
RMI连接器客户端通常使用JMXConnectorFactory
构建,其中JMXServiceURL
具有rmi
作为其协议。
如果JMXServiceURL
是由服务器生成的,如上面"connector addresses generated by the server"所述 ,那么客户端将需要直接或间接地从服务器获取它。 通常,服务器通过将其存储在文件或查找服务中来使JMXServiceURL
可用。
如果JMXServiceURL
使用目录语法,如上面在"connector addresses based on directory entries"下所述 ,则客户端可以如刚刚解释的那样获得它,或者客户端和服务器都可以知道要使用的适当的目录条目。 例如,如果对代理的whatsit连接器服务器使用的条目whatsit-agent-connector
RMI注册表中的主机myhost
,然后客户端和服务器都知道适当JMXServiceURL
是:
service:jmx:rmi:///jndi/rmi://myhost/whatsit-agent-connector
如果您具有类型为RMIServer
的RMI存根,则可以使用适当的构造函数RMIConnector
直接构造RMI连接。
动态代码下载
如果RMI连接器客户端或服务器从其对等方接收到它不知道的类的实例,并且如果动态代码下载对于RMI连接是活动的,则可以从对等方指定的代码库下载该类。 Java RMI Guide更详细地解释了这一点。
- 从以下版本开始:
- 1.5
- 另请参见:
- RFC 2045, section 6.8, "Base64 Content-Transfer-Encoding"
-
接口摘要 接口 描述 RMIConnection RMI对象用于将MBeanServer请求从客户端转发到服务器端的MBeanServer实现。RMIServer 用于建立与RMI连接器的连接的RMI对象。 -
类摘要 类 描述 RMIConnectionImpl 执行RMIConnection
接口。RMIConnectionImpl_Stub RMIConnector 与远程RMI连接器的连接。RMIConnectorServer JMX API连接器服务器,用于从远程客户端创建基于RMI的连接。RMIIIOPServerImpl Deprecated. This transport is no longer supported.RMIJRMPServerImpl 通过JRMP导出并通过JRMP导出的RMI对象创建客户端连接的RMIServer
对象。RMIServerImpl 表示连接器服务器的RMI对象。RMIServerImpl_Stub