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更详细地解释了这一点。