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传输
您可以通过在创建连接器服务器时在serviceURL的protocol部分中指定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.factory和jmx.remote.rmi.server.socket.factory。这些属性的值必须是类型为RMIClientSocketFactory和RMIServerSocketFactory的工厂,当创建与连接器关联的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
- 参见:
-
ClassDescription用于将来自客户端的 MBeanServer 请求转发到服务器端其 MBeanServer 实现的 RMI 对象。实现了
RMIConnection接口。RMIConnectionImpl 远程存根。与远程 RMI 连接相关的连接。创建基于 RMI 的连接以供远程客户端使用的 JMX API 连接器服务器。通过 JRMP 导出的RMIServer对象,创建作为通过 JRMP 导出的 RMI 对象的客户端连接。用于建立与 RMI 连接器的连接的 RMI 对象。代表连接器服务器的 RMI 对象。RMIServerImpl 远程存根。