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 远程存根。