mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-07-08 10:46:28 +08:00
197 lines
20 KiB
HTML
197 lines
20 KiB
HTML
<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> |