197 lines
20 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="header">
<h1 class="title" title="Package">Package javax.management.remote.rmi</h1>
<div class="docSummary">
<div class="block">
RMI连接器是JMX Remote API的连接器它使用RMI将客户端请求传输到远程MBean服务器。
</div>
</div>
<p>See: <a href="#package.description">描述</a></p>
</div><div class="contentContainer">
<ul class="blockList">
<li class="blockList">
<table border="0" cellpadding="3" cellspacing="0" class="typeSummary" summary="Interface Summary table, listing interfaces, and an explanation">
<caption>
<span>接口摘要</span>
<span class="tabEnd"> </span>
</caption>
<tbody>
<tr>
<th class="colFirst" scope="col">接口</th>
<th class="colLast" scope="col">描述</th>
</tr>
</tbody>
<tbody>
<tr class="altColor">
<td class="colFirst"><a href="../../../../javax/management/remote/rmi/RMIConnection.html" title="interface in javax.management.remote.rmi">RMIConnection</a></td>
<td class="colLast">
<div class="block">
用于将MBeanServer请求从客户端转发到其在服务器端的MBeanServer实现的RMI对象。
</div> </td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../../javax/management/remote/rmi/RMIServer.html" title="interface in javax.management.remote.rmi">RMIServer</a></td>
<td class="colLast">
<div class="block">
用于建立与RMI连接器的连接的RMI对象。
</div> </td>
</tr>
</tbody>
</table> </li>
<li class="blockList">
<table border="0" cellpadding="3" cellspacing="0" class="typeSummary" summary="Class Summary table, listing classes, and an explanation">
<caption>
<span>类摘要</span>
<span class="tabEnd"> </span>
</caption>
<tbody>
<tr>
<th class="colFirst" scope="col"></th>
<th class="colLast" scope="col">描述</th>
</tr>
</tbody>
<tbody>
<tr class="altColor">
<td class="colFirst"><a href="../../../../javax/management/remote/rmi/RMIConnectionImpl.html" title="class in javax.management.remote.rmi">RMIConnectionImpl</a></td>
<td class="colLast">
<div class="block">
<span>实现<a href="../../../../javax/management/remote/rmi/RMIConnection.html" title="javax.management.remote.rmi中的接口"><code>RMIConnection</code></a>接口。</span>
</div> </td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../../javax/management/remote/rmi/RMIConnectionImpl_Stub.html" title="class in javax.management.remote.rmi">RMIConnectionImpl_Stub</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../../javax/management/remote/rmi/RMIConnector.html" title="class in javax.management.remote.rmi">RMIConnector</a></td>
<td class="colLast">
<div class="block">
与远程RMI连接器的连接。
</div> </td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../../javax/management/remote/rmi/RMIConnectorServer.html" title="class in javax.management.remote.rmi">RMIConnectorServer</a></td>
<td class="colLast">
<div class="block">
从远程客户端创建基于RMI的连接的JMX API连接器服务器。
</div> </td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../../javax/management/remote/rmi/RMIIIOPServerImpl.html" title="class in javax.management.remote.rmi">RMIIIOPServerImpl</a></td>
<td class="colLast">
<div class="block">
<span>一个<a href="../../../../javax/management/remote/rmi/RMIServerImpl.html" title="javax.management.remote.rmi中的类"><code>RMIServerImpl</code></a> 它通过IIOP导出并可创建如同由IIOP导出的RMI对象客户端连接。</span>
</div> </td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../../javax/management/remote/rmi/RMIJRMPServerImpl.html" title="class in javax.management.remote.rmi">RMIJRMPServerImpl</a></td>
<td class="colLast">
<div class="block">
<span>一个<a href="../../../../javax/management/remote/rmi/RMIServer.html" title="javax.management.remote.rmi中的接口"><code>RMIServer</code></a> 它通过JRMP导出并可创建如同由JRMP导出的RMI对象的客户端连接的对象。</span>
</div> </td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../../javax/management/remote/rmi/RMIServerImpl.html" title="class in javax.management.remote.rmi">RMIServerImpl</a></td>
<td class="colLast">
<div class="block">
表示连接器服务器的RMI对象。
</div> </td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../../javax/management/remote/rmi/RMIServerImpl_Stub.html" title="class in javax.management.remote.rmi">RMIServerImpl_Stub</a></td>
<td class="colLast"> </td>
</tr>
</tbody>
</table> </li>
</ul>
<a name="package.description">
<!-- --> </a>
<h2 title="Package javax.management.remote.rmi Description">Package javax.management.remote.rmi Description</h2>
<div class="block">
<p> <span>RMI连接器是JMX Remote API的连接器它使用RMI将客户端请求传输到远程MBean服务器。</span> <span>此包定义了RMI连接器的用户需要直接引用的类对于客户端和服务器端。</span> <span>它还定义了用户通常不会直接引用的某些类但必须定义这些类以便RMI连接器的不同实现可以互操作。</span> </p>
<p> <span>RMI连接器支持用于RMI的JRMP传输以及可选的IIOP传输。</span> </p>
<p> <span>像JMX Remote API中的大多数连接器一样RMI连接器通常有一个地址它是一个<a href="../../../../javax/management/remote/JMXServiceURL.html" title="javax.management.remote中的类"><code>JMXServiceURL</code></a></span> <span>对于使用默认RMI传输JRMP的连接器该地址的协议部分是<code>rmi</code> 或者是使用RMI / IIOP的<code>iiop</code>器的iiop。</span> </p>
<p> <span>RMI连接器地址有两种形式</span> </p>
<ul>
<li> <span><em>JNDI表单中</em> URL表示<em>在哪里可以找到连接器的RMI存根</em></span> <span>此RMI存根是一种类型为<a href="../../../../javax/management/remote/rmi/RMIServer.html" title="javax.management.remote.rmi中的接口"><code>RMIServer</code></a>的Java对象可以远程访问连接器服务器。</span> <span>使用此地址表单RMI存根从URL中包含的外部目录条目获取。</span> <span>外部目录是由<a href="../../../../javax/naming/package-summary.html"><code>JNDI</code></a>识别的任何目录通常是RMI注册表LDAP或COS命名。</span> </li>
<li> <span><em>编码形式中</em> URL直接包含连接到连接器服务器所需的信息。</span> <span>使用RMI / JRMP时编码格式是服务器对象的序列化RMI存根使用BASE64编码无需嵌入的换行符。</span> <span>当使用RMI / IIOP时编码格式是服务器对象的CORBA IOR。</span> </li>
</ul>
<p> <span>下面将详细介绍地址。</span> </p>
<h3> <span>创建RMI连接器服务器</span> </h3>
<p> <span>创建RMI连接器服务器的通常方法是向方法<a href="../../../../javax/management/remote/JMXConnectorServerFactory.html#newJMXConnectorServer-javax.management.remote.JMXServiceURL-java.util.Map-javax.management.MBeanServer-"><code>JMXConnectorServerFactory.newJMXConnectorServer</code></a>提供RMI连接器地址。</span> <span>可以将连接器服务器所连接的MBean服务器指定为该方法的参数。</span> <span>或者连接器服务器可以被注册为MBean服务器中的MBean。</span> </p>
<p> <span>RMI连接器服务器也可以通过构建的实例创建<a href="../../../../javax/management/remote/rmi/RMIConnectorServer.html" title="javax.management.remote.rmi中的类"><code>RMIConnectorServer</code></a> 明确地或通过Mbean服务器的<code>createMBean</code>方法。</span> </p>
<h4> <span>选择RMI传输</span> </h4>
<p> <span>您可以通过指定选择RMI传输方式JRMP或IIOP <code>rmi</code><code>iiop</code><code><em>protocol</em></code>的一部分<code>serviceURL</code>创建连接器服务器时。</span> <span>您也可以通过实例化一个合适的子类创建特殊的连接服务器<a href="../../../../javax/management/remote/rmi/RMIServerImpl.html" title="javax.management.remote.rmi中的类"><code>RMIServerImpl</code></a>并将其提供给<code>RMIConnectorServer</code>构造。</span> </p>
<h4> <span><a name="servergen">Connector addresses generated by the server</a></span> </h4>
<p> <span>如果您指定的<code>serviceURL</code>具有空的URL路径可选主机和端口之后或者如果不指定<code>serviceURL</code> ,则连接器服务器将制造一个新的客户端可用于连接的<code>JMXServiceURL</code> </span> </p>
<ul>
<li><p> <span>如果<code>serviceURL</code>看起来像:</span> </p><pre> <span><code>service:jmx:rmi://<em>host</em>:<em>port</em></code></span> </pre><p> <span>那么连接器服务器将生成一个<a href="../../../../javax/management/remote/rmi/RMIJRMPServerImpl.html" title="javax.management.remote.rmi中的类"><code>RMIJRMPServerImpl</code></a> ,返回的<code>JMXServiceURL</code>看起来像:</span> </p><pre> <span><code>service:jmx:rmi://<em>host</em>:<em>port</em>/stub/<em>XXXX</em></code></span> </pre><p> <span>其中<code><em>XXXX</em></code>是生成对象的存根的序列化形式编码为BASE64而不带换行符。</span> </p></li>
<li><p> <span>如果<code>serviceURL</code>看起来像:</span> </p><pre> <span><code>service:jmx:iiop://<em>host</em>:<em>port</em></code></span> </pre><p> <span>那么连接器服务器将生成一个<a href="../../../../javax/management/remote/rmi/RMIIIOPServerImpl.html" title="javax.management.remote.rmi中的类"><code>RMIIIOPServerImpl</code></a> ,返回的<code>JMXServiceURL</code>如下所示:</span> </p><pre> <span><code>service:jmx:iiop://<em>host</em>:<em>port</em>/ior/IOR:<em>XXXX</em></code></span> </pre><p> <span>其中<code>IOR:<em>XXXX</em></code>是生成对象的可互操作对象引用的标准CORBA编码。</span> </p></li>
<li><p> <span>如果没有<code>serviceURL</code> ,必须有用户提供的<code>RMIServerImpl</code></span> <span>如果此对象上的<a href="../../../../javax/management/remote/rmi/RMIServerImpl.html#toStub--"><code>toStub</code></a>方法返回<a href="../../../../javax/rmi/CORBA/Stub.html" title="javax.rmi.CORBA中的类"><code>Stub</code></a>的实例,则连接器服务器将使用上述<code>iiop</code>形式生成<code>JMXServiceURL</code></span> <span>否则,将使用<code>rmi</code>表单生成一个<code>JMXServiceURL</code></span> </p></li>
</ul>
<p> <span><code><em>host</em></code>在用户提供的<code>serviceURL</code>是可选的。</span> <span>如果存在,则将其复制到生成的<code>JMXServiceURL</code> ,否则忽略。</span> <span>如果不存在,则生成的<code>JXMServiceURL</code>将具有本地主机名。</span> </p>
<p> <span><code><em>port</em></code>在用户提供的<code>serviceURL</code>也是可选的。</span> <span>如果存在,它也被复制到生成的<code>JMXServiceURL</code> ;</span> <span>否则,生成的<code>JMXServiceURL</code>没有端口。</span> <span>对于<code>serviceURL</code>使用<code>rmi</code>协议中, <code><em>port</em></code> ,如果存在,则指示哪个端口所生成的远程对象应导出上。</span> <span>没有其他的效果。</span> </p>
<p> <span>如果用户提供<code>RMIServerImpl</code>而不是<code>JMXServiceURL</code> ,则生成的<code>JMXServiceURL</code>将在其<code><em>host</em></code>部分中具有本地主机名, <code><em>host</em></code> <code><em>port</em></code></span> </p>
<h4> <span><a name="directory">Connector addresses based on directory entries</a></span> </h4>
<p> <span>作为刚刚描述的<code>serviceURL</code>地址的<code>serviceURL</code> ,创建连接器服务器时提供的<code>serviceURL</code>地址可以指定要存储提供或生成的<code>RMIServer</code>存根的<em>目录地址</em></span> <span>该目录地址然后由客户端和服务器使用。</span> </p>
<p> <span>在这种情况下, <code>serviceURL</code>有以下两种形式之一:</span> </p>
<pre> <span><code>service:jmx:rmi://<em>host</em>:<em>port</em>/jndi/<em>jndi-name</em></code>
<code>service:jmx:iiop://<em>host</em>:<em>port</em>/jndi/<em>jndi-name</em></code></span> </pre>
<p> <span>这里, <code><em>jndi-name</em></code>是一个可以提供给<a href="../../../../javax/naming/InitialContext.html#bind-java.lang.String-java.lang.Object-"><code>javax.naming.InitialContext.bind</code></a>的字符串。</span> </p>
<p> <span>像往常一样, <code><em>host</em></code><code>:<em>port</em></code>可以省略。</span> </p>
<p> <span>连接器服务器将生成一个<code>RMIServerImpl</code>基于协议( <code>rmi</code><code>iiop</code> ),对于<code>rmi</code> ,所述<code><em>port</em></code>如果有的话。</span> <span>当连接器服务器启动时,它将使用其<a href="../../../../javax/management/remote/rmi/RMIServerImpl.html#toStub--"><code>toStub</code></a>方法从该对象导出一个存根,并使用给定的<code><em>jndi-name</em></code>存储对象。</span> <span>JNDI API定义的属性如常一样。</span> </p>
<p> <span>例如,如果<code>JMXServiceURL</code>是:</span> </p>
<pre> <span><code>service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname</code></span> </pre>
<span>那么连接器服务器将生成一个<code>RMIJRMPServerImpl</code>并使用JNDI名称存储其存根</span>
<pre> <span><code>rmi://myhost/myname</code></span> </pre>
<span>这意味着进入<code>myname</code>在主机的默认端口上运行的RMI注册表<code>myhost</code></span>
<span>请注意RMI注册表仅允许从本地主机注册。</span>
<span>因此,在这种情况下, <code>myhost</code>必须是连接器服务器正在运行的主机的名称(或名称)。</span>
<p></p>
<p> <span>在这个<code>JMXServiceURL</code> ,第一个<code>rmi:</code>指定了RMI连接器而第二个<code>rmi:</code>指定了RMI注册表。</span> </p>
<p> <span>另一个例子,如果<code>JMXServiceURL</code>是:</span> </p>
<pre> <span><code>service:jmx:iiop://ignoredhost/jndi/ldap://dirhost:9999/cn=this,ou=that</code></span> </pre>
<span>那么连接器服务器将生成一个<code>RMIIIOPServerImpl</code>并使用JNDI名称存储其存根</span>
<pre> <span><code>ldap://dirhost:9999/cn=this,ou=that</code></span> </pre>
<span>这意味着进入<code>cn=this,ou=that</code>在主机的端口9999上运行的LDAP目录<code>dirhost</code></span>
<p></p>
<p> <span>如果<code>JMXServiceURL</code>是:</span> </p>
<pre> <span><code>service:jmx:iiop://ignoredhost/jndi/cn=this,ou=that</code></span> </pre>
<span>那么连接器服务器将生成一个<code>RMIIIOPServerImpl</code>并使用JNDI名称存储其存根</span>
<pre> <span><code>cn=this,ou=that</code></span> </pre>
<span>对于这种情况JNDI API必须已经适当配置以提供有关要使用的目录的信息。</span>
<p></p>
<p> <span>在这些示例中,连接器服务器或其客户端不使用主机名<code>ignoredhost</code></span> <span>可以省略,例如:</span> </p>
<pre> <span><code>service:jmx:iiop:///jndi/cn=this,ou=that</code></span> </pre>
<p> <span>但是,使用连接器服务器正在运行的主机的名称是个好习惯。</span> <span>这通常不同于目录主机的名称。</span> </p>
<h4> <span>连接器服务器属性</span> </h4>
<p> <span>当使用默认的JRMP传输方式RMI套接字工厂可以使用属性来指定<code>jmx.remote.rmi.client.socket.factory</code><code>jmx.remote.rmi.server.socket.factory</code><code>environment</code>给予<code>RMIConnectorServer</code>构造。</span> <span>这些属性的值的类型必须是<a href="../../../../java/rmi/server/RMIClientSocketFactory.html" title="java.rmi.server中的接口"><code>RMIClientSocketFactory</code></a><a href="../../../../java/rmi/server/RMIServerSocketFactory.html" title="java.rmi.server中的接口"><code>RMIServerSocketFactory</code></a>分别。</span> <span>当创建与连接器相关联的RMI对象时将使用这些工厂。</span> </p>
<h3> <span>创建RMI连接器客户端</span> </h3>
<p> <span>RMI连接器客户端通常使用<a href="../../../../javax/management/remote/JMXConnectorFactory.html" title="javax.management.remote中的类"><code>JMXConnectorFactory</code>构建</a> ,其中<code>JMXServiceURL</code>具有<code>rmi</code><code>iiop</code>作为其协议。</span> </p>
<p> <span>如果<code>JMXServiceURL</code>是由服务器生成的,如上述<a href="#servergen">"connector addresses generated by the server"</a>所述,客户端将需要直接或间接从服务器获取。</span> <span>通常,服务器通过将其存储在文件或查找服务<code>JMXServiceURL</code> JMXServiceURL可用。</span> </p>
<p> <span>如果<code>JMXServiceURL</code>使用目录语法,如上述<a href="#directory">"connector addresses based on directory entries"所述</a> ,则客户端可以如刚刚解释的那样获得目录语法,或者客户机和服务器都可以知道要使用的适当的目录条目。</span> <span>例如如果对代理的whatsit连接器服务器使用的条目<code>whatsit-agent-connector</code> RMI注册表中的主机<code>myhost</code> ,然后客户端和服务器都知道适当<code>JMXServiceURL</code>是:</span> </p>
<pre> <span><code>service:jmx:rmi:///jndi/rmi://myhost/whatsit-agent-connector</code></span> </pre>
<p> <span>如果您有类型的RMI存根<a href="../../../../javax/management/remote/rmi/RMIServer.html" title="javax.management.remote.rmi中的接口"><code>RMIServer</code></a> 您可以通过使用适当的构造函数直接构造RMI连接<a href="../../../../javax/management/remote/rmi/RMIConnector.html" title="javax.management.remote.rmi中的类"><code>RMIConnector</code></a></span> </p>
<h3> <span>为RMI / IIOP连接器指定ORB</span> </h3>
<p> <span>当使用IIOP传输时客户端和服务器可以指定要与属性<code>java.naming.corba.orb</code>一起使用的ORB。</span> <span>连接到ORB发生在<a href="../../../../javax/management/remote/rmi/RMIConnectorServer.html#start--"><code>start</code></a>时间连接器服务器,并在<a href="../../../../javax/management/remote/rmi/RMIConnector.html#connect-java.util.Map-"><code>connect</code></a>时间为连接器的客户端。</span> <span>如果<code>java.naming.corba.orb</code>属性包含在环境地图,那么它的值( <a href="../../../../org/omg/CORBA/ORB.html" title="在org.omg.CORBA中的类"><code>ORB</code></a> 用于连接所述IIOP存根。</span> <span>否则,通过调用<a href="../../../../org/omg/CORBA/ORB.html" title="在org.omg.CORBA中的类"><code>org.omg.CORBA.ORB.init((String[])null,(Properties)null)</code></a>创建一个新的<a href="../../../../org/omg/CORBA/ORB.html" title="在org.omg.CORBA中的类">org.omg.CORBA.ORB</a></span> <span>同一JVM中的后续RMI连接器客户端或服务器可以重用此ORB或者可以以相同的方式创建另一个。</span> </p>
<p> <span>如果指定了<code>java.naming.corba.orb</code>属性,并没有指向<a href="../../../../org/omg/CORBA/ORB.html" title="在org.omg.CORBA中的类"><code>ORB</code></a> ,那么将抛出一个<code><a href="../../../../java/lang/IllegalArgumentException.html" title="class in java.lang"><code>IllegalArgumentException</code></a></code></span> </p>
<p> <span>此处描述的机制不适用于IIOP远程对象存根或服务器在传送到RMIConnector和RMIConnectorServer之前手动创建并连接到ORB。</span> </p>
<h3> <span>动态代码下载</span> </h3>
<p> <span>如果RMI连接器客户端或服务器从其对等体接收到其不知道的类的实例并且如果动态代码下载对于RMI连接是活动的则可以从对等体指定的代码库下载该类。</span> <span>文章<a href="../../../../../technotes/guides/rmi/codebase.html"><em>Dynamic code downloading using Java RMI</em></a>更详细地解释了这一点。</span> </p>
</div>
<dl>
<dt>
<span class="simpleTagLabel">从以下版本开始:</span>
</dt>
<dd>
1.5
</dd>
<dt>
<span class="seeLabel">另请参见:</span>
</dt>
<dd>
<a href="../../../../../technotes/guides/rmi/index.html"> Java<sup><font size="-1">TM</font></sup> Remote Method Invocation (RMI)</a>,
<a href="../../../../../technotes/guides/jndi/index.html"> Java Naming and Directory Interface<sup><font size="-1">TM</font></sup> (JNDI)</a>,
<a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045, section 6.8, "Base64 Content-Transfer-Encoding"</a>
</dd>
</dl>
</div>