包 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 form 中,URL 表示 where to find an RMI stub for the connector 。此 RMI 存根是一个
RMIServer
类型的 Java 对象,它提供对连接器服务的远程访问。使用这种地址形式,RMI 存根是从包含在 URL 中的外部目录条目中获得的。外部目录是JNDI
识别的任何目录,通常是 RMI 注册表、LDAP 或 COS 命名。 - 在 encoded form 中,URL 直接包含连接到连接器服务所需的信息。使用 RMI/JRMP 时,编码形式是服务对象的序列化 RMI 存根,使用 BASE64 编码,没有嵌入换行符。
地址在下面有更详细的介绍。
创建 RMI 连接器服务
创建 RMI 连接器服务的常用方法是向方法 JMXConnectorServerFactory.newJMXConnectorServer
提供 RMI 连接器地址。可以将连接器服务附加到的 MBean 服务指定为该方法的参数。或者,可以将连接器服务注册为该 MBean 服务中的 MBean。
还可以通过构造 RMIConnectorServer
的实例来创建 RMI 连接器服务,显式地或通过 MBean 服务的 createMBean
方法。
选择 RMI 传输
创建连接器服务时,您可以通过在 serviceURL
的 protocol
部分指定 rmi
来选择 RMI 传输。您还可以通过实例化 RMIServerImpl
的适当子类并将其提供给 RMIConnectorServer
构造函数来创建专用连接器服务。
服务生成的连接器地址
如果您指定的 serviceURL
有一个空的 URL 路径(在可选的主机和端口之后),或者如果您没有指定 serviceURL
,那么连接器服务将创建一个新的 JMXServiceURL
客户端可以用来连接:
如果
serviceURL
看起来像:service:jmx:rmi://host:port
然后连接器服务将生成一个
RMIJRMPServerImpl
并且返回的JMXServiceURL
如下所示:service:jmx:rmi://host:port/stub/XXXX
其中
XXXX
是生成对象存根的序列化形式,以 BASE64 编码,没有换行符。如果没有
serviceURL
,则必须有用户提供的RMIServerImpl
。连接器服务将使用rmi
表单生成一个JMXServiceURL
。
用户提供的 serviceURL
中的 host
是可选的。如果存在,它将被复制到生成的 JMXServiceURL
中,否则将被忽略。如果不存在,生成的 JXMServiceURL
将具有本地主机名。
用户提供的 serviceURL
中的 port
也是可选的。如果存在,它也会被复制到生成的 JMXServiceURL
中;否则,生成的 JMXServiceURL
没有端口。对于使用 rmi
协议的 serviceURL
,port
(如果存在)指示应在哪个端口上导出生成的远程对象。它没有其他作用。
如果用户提供的是 RMIServerImpl
而不是 JMXServiceURL
,那么生成的 JMXServiceURL
的 host
部分将包含本地主机名,而没有 port
。
基于目录条目的连接器地址
作为刚刚描述的生成地址的替代方案,创建连接器服务时提供的 serviceURL
地址可以指定一个 directory address 来存储提供或生成的 RMIServer
存根。该目录地址随后由客户端和服务使用。
在这种情况下,serviceURL
具有以下形式:
service:jmx:rmi://host:port/jndi/jndi-name
在这里,jndi-name
是一个可以提供给 javax.naming.InitialContext.bind
的字符串。
和往常一样,host
和 :port
可以省略。
连接器服务将根据协议 (rmi
) 和 port
(如果有)生成一个 RMIServerImpl
。当连接器服务启动时,它将使用其 toStub
方法从此对象派生一个存根,并使用给定的 jndi-name
存储该对象。像往常一样查询由 JNDI API 定义的属性。
例如,如果 JMXServiceURL
是:
service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
然后连接器服务将生成一个 RMIJRMPServerImpl
并使用 JNDI 名称
rmi://myhost/myname
存储其存根,这意味着在主机 myhost
的默认端口上运行的 RMI 注册表中的条目 myname
。请注意,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
存储其存根,这意味着在主机 dirhost
的端口 9999 上运行的 LDAP 目录中的条目 cn=this,ou=that
。
如果 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
但是,最好使用运行连接器服务的主机的名称。这通常与目录主机的名称不同。
连接器服务属性
当使用默认的 JRMP 传输时,RMI 套接字工厂可以使用 environment
中的属性 jmx.remote.rmi.client.socket.factory
和 jmx.remote.rmi.server.socket.factory
指定给 RMIConnectorServer
构造函数。这些属性的值必须分别为 RMIClientSocketFactory
和 RMIServerSocketFactory
类型。在创建与连接器关联的 RMI 对象时使用这些工厂。
创建 RMI 连接器客户端
RMI 连接器客户端通常使用 JMXConnectorFactory
构造,其中 JMXServiceURL
以 rmi
作为其协议。
如果 JMXServiceURL
是由服务生成的,如上文 “服务生成的连接器地址” 所述,则客户端需要直接或间接从服务获取它。通常,服务通过将 JMXServiceURL
存储在文件或查找服务中来使它可用。
如果 JMXServiceURL
使用目录语法,如上文 “基于目录条目的连接器地址” 所述,那么客户端可能会像刚才解释的那样获取它,或者客户端和服务可能都知道要使用的适当目录条目。例如,如果 Whatsit 代理的连接器服务使用主机 myhost
上 RMI 注册表中的条目 whatsit-agent-connector
,则客户端和服务都可以知道适当的 JMXServiceURL
是:
service:jmx:rmi:///jndi/rmi://myhost/whatsit-agent-connector
如果您有 RMIServer
类型的 RMI 存根,则可以使用 RMIConnector
的适当构造函数直接构造 RMI 连接。
动态代码下载
如果 RMI 连接器客户端或服务从其对等方接收到一个它不知道的类的实例,并且如果动态代码下载对于 RMI 连接处于活动状态,则可以从对等方指定的代码库下载该类。 Java RMI 指南 更详细地解释了这一点。
- 自从:
- 1.5
- 参见:
-
类描述RMI 对象用于将 MBeanServer 请求从客户端转发到服务端的 MBeanServer 实现。
RMIConnection
接口的实现。RMIConnectionImpl 远程存根。与远程 RMI 连接器的连接。一个 JMX API 连接器服务,它从远程客户端创建基于 RMI 的连接。已弃用。不再支持此传输。一个RMIServer
对象,它通过 JRMP 导出并创建客户端连接作为通过 JRMP 导出的 RMI 对象。用于建立与 RMI 连接器的连接的 RMI 对象。表示连接器服务的 RMI 对象。RMIServerImpl 远程存根。