Package 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表单中 ,URL表示在哪里可以找到连接器的RMI存根 。 此RMI存根是一个类型为
RMIServer的Java对象,可以远程访问连接器服务器。 使用此地址表单,RMI存根从URL中包含的外部目录条目获取。 外部目录是由JNDI识别的任何目录,通常是RMI注册表,LDAP或COS命名。 - 在编码形式中 ,URL直接包含连接到连接器服务器所需的信息。 使用RMI / JRMP时,编码格式是服务器对象的序列化RMI存根,使用BASE64编码,无需嵌入的换行符。
下面将详细介绍地址。
创建RMI连接器服务器
创建RMI连接器服务器的通常方法是向方法JMXConnectorServerFactory.newJMXConnectorServer提供RMI连接器地址。 可以将连接器服务器所连接的MBean服务器指定为该方法的参数。 或者,连接器服务器可以被注册为MBean服务器中的MBean。
也可以通过构建一个RMIConnectorServer的实例来显式地或通过MBean服务器的createMBean方法创建RMI连接器服务器。
选择RMI传输
您可以在创建连接器服务器时在serviceURL的protocol部分中指定rmi选择RMI传输。 您还可以通过实例化一个适当的RMIServerImpl子类并将其提供给RMIConnectorServer构造函数来创建专用的连接器服务器。
Connector addresses generated by the server
如果您指定的serviceURL具有空的URL路径(可选主机和端口之后),或者如果未指定serviceURL ,那么连接器服务器将制造一个新的JMXServiceURL ,客户端可以用它来连接:
如果
serviceURL看起来像:service:jmx:rmi://host:port那么连接器服务器将生成一个
RMIJRMPServerImpl,返回的JMXServiceURL看起来像:service:jmx:rmi://host:port/stub/XXXX其中
XXXX是生成对象的存根的序列化形式,编码为BASE64而不带换行符。如果没有
serviceURL,必须有用户提供的RMIServerImpl。 连接器服务器将生成一个JMXServiceURL使用rmi形式。
host在用户提供的serviceURL是可选的。 如果存在,则将其复制到生成的JMXServiceURL ,否则忽略。 如果不存在,则生成的JXMServiceURL将具有本地主机名。
port在用户提供的serviceURL也是可选的。 如果存在,它也被复制到生成的JMXServiceURL ; 否则,生成的JMXServiceURL没有端口。 对于serviceURL使用rmi协议中, port ,如果存在,则指示哪个端口所生成的远程对象应导出上。 没有其他的效果。
如果用户提供RMIServerImpl而不是JMXServiceURL ,则生成的JMXServiceURL将在其host部分中具有本地主机名,而不是port 。
Connector addresses based on directory entries
作为刚刚描述的生成地址的替代方法,创建连接器服务器时提供的serviceURL地址可以指定存储提供或生成的RMIServer存根的目录地址 。 该目录地址然后由客户端和服务器使用。
在这种情况下, serviceURL具有以下形式:
service:jmx:rmi://host:port/jndi/jndi-name
这里, jndi-name是一个可以提供给javax.naming.InitialContext.bind的字符串。
像往常一样, host和:port可以省略。
连接器服务器将生成一个RMIServerImpl基于所述协议( 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:rmi://ignoredhost/jndi/ldap://dirhost:9999/cn=this,ou=that
那么连接器服务器将生成一个RMIJRMPServerImpl并使用JNDI名称存储其存根
ldap://dirhost:9999/cn=this,ou=that
这意味着进入cn=this,ou=that在主机的端口9999上运行的LDAP目录dirhost 。
如果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套接字工厂可以使用属性来指定jmx.remote.rmi.client.socket.factory和jmx.remote.rmi.server.socket.factory在environment给予RMIConnectorServer构造。 这些属性的值必须分别为RMIClientSocketFactory和RMIServerSocketFactory 。 当创建与连接器相关联的RMI对象时,将使用这些工厂。
创建RMI连接器客户端
RMI连接器客户端通常使用JMXConnectorFactory构建,其中JMXServiceURL具有rmi作为其协议。
如果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
如果您有一个类型为RMIServer的RMI存根,则可以使用适当的构造函数RMIConnector直接构建RMI连接。
动态代码下载
如果RMI连接器客户端或服务器从其对等体接收到其不知道的类的实例,并且如果动态代码下载对于RMI连接是活动的,则可以从对等体指定的代码库下载该类。 文章Dynamic code downloading using Java RMI更详细地解释了这一点。
-
接口摘要 接口 描述 RMIConnection 用于将MBeanServer请求从客户端转发到其在服务器端的MBeanServer实现的RMI对象。RMIServer 用于建立与RMI连接器的连接的RMI对象。 -
类摘要 Class 描述 RMIConnectionImpl 实现RMIConnection接口。RMIConnectionImpl_Stub RMIConnector 与远程RMI连接器的连接。RMIConnectorServer 从远程客户端创建基于RMI的连接的JMX API连接器服务器。RMIIIOPServerImpl Deprecated. 此运输已不再受支持。RMIJRMPServerImpl 一个RMIServer对象,通过JRMP导出,并将客户端连接创建为通过JRMP导出的RMI对象。RMIServerImpl 表示连接器服务器的RMI对象。RMIServerImpl_Stub