Package javax.management.remote.rmi


package javax.management.remote.rmi

RMI连接器是JMX远程API的一个连接器,它使用RMI来传输客户端请求到远程MBean服务器。该包定义了用户在RMI连接器中需要直接引用的类,包括客户端和服务器端。它还定义了用户通常不会直接引用但必须定义的某些类,以便不同实现的RMI连接器可以互操作。

RMI连接器支持RMI的JRMP传输。

与JMX远程API中的大多数连接器一样,RMI连接器通常具有一个地址,这是一个JMXServiceURL。该地址的协议部分是rmi,用于使用默认RMI传输(JRMP)的连接器。

RMI连接器地址有两种形式:

  • JNDI形式中,URL指示在哪里找到连接器的RMI存根。这个RMI存根是一个类型为RMIServer的Java对象,它提供对连接器服务器的远程访问。使用此地址形式,RMI存根是从URL中包含的外部目录条目中获取的。外部目录是任何由JNDI识别的目录,通常是RMI注册表、LDAP或COS命名。
  • 编码形式中,URL直接包含连接到连接器服务器所需的信息。当使用RMI/JRMP时,编码形式是使用BASE64对服务器对象的序列化RMI存根进行编码,不包含嵌入的换行符。

下面更详细地介绍了地址。

创建RMI连接器服务器

创建RMI连接器服务器的常规方法是向方法JMXConnectorServerFactory.newJMXConnectorServer提供一个RMI连接器地址。连接器服务器附加到的MBean服务器可以作为该方法的参数指定。另外,连接器服务器可以在该MBean服务器中注册为一个MBean。

也可以通过显式构造RMIConnectorServer的实例或通过MBean服务器的createMBean方法来创建RMI连接器服务器。

选择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协议的serviceURL,如果存在,则port指示生成的远程对象应该导出的端口。它没有其他效果。

如果用户提供的是RMIServerImpl而不是JMXServiceURL,则生成的JMXServiceURL将在其host部分中具有本地主机名,而没有port

基于目录条目的连接器地址

作为刚才描述的生成地址的替代方案,在创建连接器服务器时提供的serviceURL地址可以指定一个目录地址,用于存储提供的或生成的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传输时,可以在提供给RMIConnectorServer构造函数的environment中指定RMI套接字工厂,使用属性jmx.remote.rmi.client.socket.factoryjmx.remote.rmi.server.socket.factory。这些属性的值必须是类型为RMIClientSocketFactoryRMIServerSocketFactory的工厂,当创建与连接器关联的RMI对象时使用这些工厂。

创建RMI连接器客户端

通常使用JMXConnectorFactory构造RMI连接器客户端,使用rmi作为其协议的JMXServiceURL

如果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指南对此进行了更详细的解释。

自 JDK 版本:
1.5
参见: