包 javax.management.remote.rmi


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 传输

创建连接器服务时,您可以通过在 serviceURLprotocol 部分指定 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 协议的 serviceURLport(如果存在)指示应在哪个端口上导出生成的远程对象。它没有其他作用。

如果用户提供的是 RMIServerImpl 而不是 JMXServiceURL ,那么生成的 JMXServiceURLhost 部分将包含本地主机名,而没有 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.factoryjmx.remote.rmi.server.socket.factory 指定给 RMIConnectorServer 构造函数。这些属性的值必须分别为 RMIClientSocketFactory RMIServerSocketFactory 类型。在创建与连接器关联的 RMI 对象时使用这些工厂。

创建 RMI 连接器客户端

RMI 连接器客户端通常使用 JMXConnectorFactory 构造,其中 JMXServiceURLrmi 作为其协议。

如果 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
参见: