See: 描述
| 接口 | 描述 | 
|---|---|
| RMIConnection | 
           用于将MBeanServer请求从客户端转发到其在服务器端的MBeanServer实现的RMI对象。 
          | 
| RMIServer | 
           用于建立与RMI连接器的连接的RMI对象。 
          | 
| 类 | 描述 | 
|---|---|
| RMIConnectionImpl |  
          实现了 RMIConnection接口。 | 
| RMIConnectionImpl_Stub | |
| RMIConnector | 
           与远程RMI连接器的连接。 
          | 
| RMIConnectorServer | 
           从远程客户端创建基于RMI的连接的JMX API连接器服务器。 
          | 
| RMIIIOPServerImpl |  
          一个 RMIServerImpl,它通过IIOP导出,并可创建如同由IIOP导出的RMI对象客户端连接。 | 
| RMIJRMPServerImpl |  
          一个 RMIServer,它通过JRMP导出,并可创建如同由JRMP导出的RMI对象的客户端连接的对象。 | 
| RMIServerImpl | 
           表示连接器服务器的RMI对象。 
          | 
| RMIServerImpl_Stub | 
RMI连接器是JMX Remote API的连接器,它使用RMI将客户端请求传输到远程MBean服务器。 此包定义了RMI连接器的用户需要直接引用的类,对于客户端和服务器端。 它还定义了用户通常不会直接引用的某些类,但必须定义这些类,以便RMI连接器的不同实现可以互操作。
RMI连接器支持用于RMI的JRMP传输,以及可选的IIOP传输。
 像JMX Remote API中的大多数连接器一样,RMI连接器通常有一个地址,它是一个JMXServiceURL 。 该地址的协议部分是rmi ,对于使用默认RMI传输(JRMP)的连接器,或iiop用于使用RMI / IIOP的连接器。 
RMI连接器地址有两种形式:
RMIServer的Java对象,可以远程访问连接器服务器。 使用此地址表单,RMI存根从URL中包含的外部目录条目获取。 外部目录是由JNDI识别的任何目录,通常是RMI注册表,LDAP或COS命名。 下面将详细介绍地址。
 创建RMI连接器服务器的通常方法是为方法JMXConnectorServerFactory.newJMXConnectorServer提供RMI连接器地址。 可以将连接器服务器所连接的MBean服务器指定为该方法的参数。 或者,连接器服务器可以被注册为MBean服务器中的MBean。 
 RMI连接器服务器也可以通过构建的实例创建RMIConnectorServer ,明确地或通过Mbean服务器的createMBean方法。 
 您可以通过指定选择RMI传输方式(JRMP或IIOP) rmi或iiop在protocol的一部分serviceURL创建连接器服务器时。 您也可以通过实例化一个合适的子类创建特殊的连接服务器RMIServerImpl并将其提供给RMIConnectorServer构造。 
 如果您指定的serviceURL具有空的URL路径(可选主机和端口之后),或者如果未指定serviceURL ,则连接器服务器将制造一个新的客户端可用于连接的JMXServiceURL : 
 如果serviceURL看起来像: 
  service:jmx:rmi://host:port  那么连接器服务器将生成一个RMIJRMPServerImpl ,返回的JMXServiceURL看起来像: 
  service:jmx:rmi://host:port/stub/XXXX  其中XXXX是生成对象的存根的序列化形式,编码为BASE64而不带换行符。 
 如果serviceURL看起来像: 
  service:jmx:iiop://host:port  那么连接器服务器将生成一个RMIIIOPServerImpl ,返回的JMXServiceURL如下所示: 
  service:jmx:iiop://host:port/ior/IOR:XXXX  其中IOR:XXXX是生成对象的可互操作对象引用的标准CORBA编码。 
 如果没有serviceURL ,必须有一个用户提供的RMIServerImpl 。 如果此对象上的toStub方法返回一个Stub的实例,则连接器服务器将使用上面的iiop形式生成一个JMXServiceURL 。 否则,将使用rmi形式生成一个JMXServiceURL 。 
 host在用户提供的serviceURL是可选的。 如果存在,则将其复制到生成的JMXServiceURL ,否则被忽略。 如果不存在,生成的JXMServiceURL将具有本地主机名。 
 port在用户提供的serviceURL也是可选的。 如果存在,它也被复制到生成的JMXServiceURL ; 否则,生成的JMXServiceURL没有端口。 对于serviceURL使用rmi协议中, port ,如果存在,则指示哪个端口所生成的远程对象应导出上。 没有其他的效果。 
 如果用户提供RMIServerImpl而不是JMXServiceURL ,则生成的JMXServiceURL将在其host部分中具有本地主机名, host port 。 
 作为刚刚描述的serviceURL地址的serviceURL ,创建连接器服务器时提供的serviceURL地址可以指定要存储提供或生成的RMIServer存根的目录地址 。 该目录地址然后由客户端和服务器使用。 
 在这种情况下, serviceURL有以下两种形式之一: 
  service:jmx:rmi://host:port/jndi/jndi-name
    service:jmx:iiop://host:port/jndi/jndi-name  
     这里, jndi-name是可以提供给javax.naming.InitialContext.bind的字符串。 
 像往常一样, host和:port可以省略。 
 连接器服务器将生成一个RMIServerImpl基于协议( rmi或iiop ),对于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:iiop://ignoredhost/jndi/ldap://dirhost:9999/cn=this,ou=that  
    那么连接器服务器将生成一个RMIIIOPServerImpl并使用JNDI名称存储其存根 
      ldap://dirhost:9999/cn=this,ou=that  
    这意味着进入cn=this,ou=that在主机的端口9999上运行的LDAP目录dirhost 。 
     
     如果JMXServiceURL是: 
  service:jmx:iiop://ignoredhost/jndi/cn=this,ou=that  
    那么连接器服务器将生成一个RMIIIOPServerImpl并使用JNDI名称存储其存根 
      cn=this,ou=that  
    对于这种情况,JNDI API必须已经适当配置,以提供有关要使用的目录的信息。 
     
     在这些示例中,连接器服务器或其客户端不使用主机名ignoredhost 。 可以省略,例如: 
  service:jmx:iiop:///jndi/cn=this,ou=that  
    但是,使用连接器服务器正在运行的主机的名称是个好习惯。 这通常不同于目录主机的名称。
 当使用默认的JRMP传输方式,RMI套接字工厂可以使用属性来指定jmx.remote.rmi.client.socket.factory和jmx.remote.rmi.server.socket.factory在environment给予RMIConnectorServer构造。 这些属性的值的类型必须是RMIClientSocketFactory和RMIServerSocketFactory分别。 当创建与连接器相关联的RMI对象时,将使用这些工厂。 
 RMI连接器客户端通常使用JMXConnectorFactory构建 ,其中JMXServiceURL具有rmi或iiop作为其协议。 
 如果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  
     如果您有类型的RMI存根RMIServer ,您可以通过使用适当的构造函数直接构造RMI连接RMIConnector 。 
 当使用IIOP传输时,客户端和服务器可以指定与属性java.naming.corba.orb一起使用的ORB。 连接到ORB发生在start时间连接器服务器,并在connect时间为连接器的客户端。 如果java.naming.corba.orb属性包含在环境Map中,则其值( ORB )用于连接IIOP存根。 否则,通过调用org.omg.CORBA.ORB.init((String[])null,(Properties)null)创建一个新的org.omg.CORBA.ORB 。 同一JVM中的后续RMI连接器客户端或服务器可以重用此ORB,或者可以以相同的方式创建另一个。 
 如果指定了java.naming.corba.orb属性,并没有指向ORB ,则将抛出IllegalArgumentException
此处描述的机制不适用于IIOP远程对象(存根或服务器)在传送到RMIConnector和RMIConnectorServer之前手动创建并连接到ORB。
如果RMI连接器客户端或服务器从其对等体接收到其不知道的类的实例,并且如果动态代码下载对于RMI连接是活动的,则可以从对等体指定的代码库下载该类。 文章Dynamic code downloading using Java RMI更详细地解释了这一点。
 Submit a bug or feature 
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
 Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.