1 <html> 2 <head> 3 <title>RMI connector</title> 4 <!-- 5 Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. 6 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 7 8 This code is free software; you can redistribute it and/or modify it 9 under the terms of the GNU General Public License version 2 only, as 10 published by the Free Software Foundation. Oracle designates this 11 particular file as subject to the "Classpath" exception as provided 12 by Oracle in the LICENSE file that accompanied this code. 13 14 This code is distributed in the hope that it will be useful, but WITHOUT 15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 17 version 2 for more details (a copy is included in the LICENSE file that 18 accompanied this code). 19 20 You should have received a copy of the GNU General Public License version 21 2 along with this work; if not, write to the Free Software Foundation, 22 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 23 24 Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 25 or visit www.oracle.com if you need additional information or have any 26 questions. 27 --> 28 </head> 29 <body bgcolor="white"> 30 <p>The RMI connector is a connector for the JMX Remote API that 31 uses RMI to transmit client requests to a remote MBean server. 32 This package defines the classes that the user of an RMI 33 connector needs to reference directly, for both the client and 34 server sides. It also defines certain classes that the user 35 will not usually reference directly, but that must be defined so 36 that different implementations of the RMI connector can 37 interoperate.</p> 38 39 <p>The RMI connector supports the JRMP transport for RMI, and 40 optionally the IIOP transport.</p> 41 42 <p>Like most connectors in the JMX Remote API, an RMI connector 43 usually has an address, which 44 is a {@link javax.management.remote.JMXServiceURL 45 JMXServiceURL}. The protocol part of this address is 46 <code>rmi</code> for a connector that uses the default RMI 47 transport (JRMP), or <code>iiop</code> for a connector that 48 uses RMI/IIOP.</p> 49 50 <p>There are two forms for RMI connector addresses:</p> 51 52 <ul> 53 <li> 54 In the <em>JNDI form</em>, the URL indicates <em>where to find 55 an RMI stub for the connector</em>. This RMI stub is a Java 56 object of type {@link javax.management.remote.rmi.RMIServer 57 RMIServer} that gives remote access to the connector server. 58 With this address form, the RMI stub is obtained from an 59 external directory entry included in the URL. An external 60 directory is any directory recognized by {@link javax.naming 61 JNDI}, typically the RMI registry, LDAP, or COS Naming. 62 63 <li> 64 In the <em>encoded form</em>, the URL directly includes the 65 information needed to connect to the connector server. When 66 using RMI/JRMP, the encoded form is the serialized RMI stub 67 for the server object, encoded using BASE64 without embedded 68 newlines. When using RMI/IIOP, the encoded form is the CORBA 69 IOR for the server object. 70 </ul> 71 72 <p>Addresses are covered in more detail below.</p> 73 74 75 <h3>Creating an RMI connector server</h3> 76 77 <p>The usual way to create an RMI connector server is to supply an 78 RMI connector address to the method {@link 79 javax.management.remote.JMXConnectorServerFactory#newJMXConnectorServer 80 JMXConnectorServerFactory.newJMXConnectorServer}. The MBean 81 server to which the connector server is attached can be 82 specified as a parameter to that method. Alternatively, the 83 connector server can be registered as an MBean in that MBean 84 server.</p> 85 86 <p>An RMI connector server can also be created by constructing an 87 instance of {@link 88 javax.management.remote.rmi.RMIConnectorServer 89 RMIConnectorServer}, explicitly or through the MBean server's 90 <code>createMBean</code> method.</p> 91 92 <h4>Choosing the RMI transport</h4> 93 94 <p>You can choose the RMI transport (JRMP or IIOP) by specifying 95 <code>rmi</code> or <code>iiop</code> in the 96 <code><em>protocol</em></code> part of the 97 <code>serviceURL</code> when creating the connector server. You 98 can also create specialized connector servers by instantiating 99 an appropriate subclass of {@link 100 javax.management.remote.rmi.RMIServerImpl RMIServerImpl} and 101 supplying it to the <code>RMIConnectorServer</code> 102 constructor.</p> 103 104 105 <h4><a name="servergen">Connector addresses generated by the 106 server</a></h4> 107 108 <p>If the <code>serviceURL</code> you specify has an empty URL 109 path (after the optional host and port), or if you do not 110 specify a <code>serviceURL</code>, then the connector server 111 will fabricate a new <code>JMXServiceURL</code> that clients can 112 use to connect:</p> 113 114 <ul> 115 116 <li><p>If the <code>serviceURL</code> looks like:</p> 117 118 <pre> 119 <code>service:jmx:rmi://<em>host</em>:<em>port</em></code> 120 </pre> 121 122 <p>then the connector server will generate an {@link 123 javax.management.remote.rmi.RMIJRMPServerImpl 124 RMIJRMPServerImpl} and the returned <code>JMXServiceURL</code> 125 looks like:</p> 126 127 <pre> 128 <code>service:jmx:rmi://<em>host</em>:<em>port</em>/stub/<em>XXXX</em></code> 129 </pre> 130 131 <p>where <code><em>XXXX</em></code> is the serialized form of the 132 stub for the generated object, encoded in BASE64 without 133 newlines.</p> 134 135 <li><p>If the <code>serviceURL</code> looks like:</p> 136 137 <pre> 138 <code>service:jmx:iiop://<em>host</em>:<em>port</em></code> 139 </pre> 140 141 <p>then the connector server will generate an {@link 142 javax.management.remote.rmi.RMIIIOPServerImpl 143 RMIIIOPServerImpl} and the returned 144 <code>JMXServiceURL</code> looks like:</p> 145 146 <pre> 147 <code>service:jmx:iiop://<em>host</em>:<em>port</em>/ior/IOR:<em>XXXX</em></code> 148 </pre> 149 150 <p>where <code>IOR:<em>XXXX</em></code> is the standard CORBA 151 encoding of the Interoperable Object Reference for the 152 generated object.</p> 153 154 <li><p>If there is no <code>serviceURL</code>, there must be a 155 user-provided <code>RMIServerImpl</code>. If the {@link 156 javax.management.remote.rmi.RMIServerImpl#toStub toStub} 157 method on this object returns an instance of {@link 158 javax.rmi.CORBA.Stub}, then the connector server will generate 159 a <code>JMXServiceURL</code> using the <code>iiop</code> 160 form above. Otherwise, it will generate a 161 <code>JMXServiceURL</code> using the <code>rmi</code> 162 form.</p> 163 164 </ul> 165 166 <p>The <code><em>host</em></code> in a user-provided 167 <code>serviceURL</code> is optional. If present, it is copied 168 into the generated <code>JMXServiceURL</code> but otherwise 169 ignored. If absent, the generated <code>JXMServiceURL</code> 170 will have the local host name.</p> 171 172 <p>The <code><em>port</em></code> in a user-provided 173 <code>serviceURL</code> is also optional. If present, it is 174 also copied into the generated <code>JMXServiceURL</code>; 175 otherwise, the generated <code>JMXServiceURL</code> has no port. 176 For an <code>serviceURL</code> using the <code>rmi</code> 177 protocol, the <code><em>port</em></code>, if present, indicates 178 what port the generated remote object should be exported on. It 179 has no other effect.</p> 180 181 <p>If the user provides an <code>RMIServerImpl</code> rather than a 182 <code>JMXServiceURL</code>, then the generated 183 <code>JMXServiceURL</code> will have the local host name in its 184 <code><em>host</em></code> part and no 185 <code><em>port</em></code>.</p> 186 187 188 <h4><a name="directory">Connector addresses based on directory 189 entries</a></h4> 190 191 <p>As an alternative to the generated addresses just described, 192 the <code>serviceURL</code> address supplied when creating a 193 connector server can specify a <em>directory address</em> in 194 which to store the provided or generated <code>RMIServer</code> 195 stub. This directory address is then used by both client and 196 server.</p> 197 198 <p>In this case, the <code>serviceURL</code> has one of these two 199 forms:</p> 200 201 <pre> 202 <code>service:jmx:rmi://<em>host</em>:<em>port</em>/jndi/<em>jndi-name</em></code> 203 <code>service:jmx:iiop://<em>host</em>:<em>port</em>/jndi/<em>jndi-name</em></code> 204 </pre> 205 206 <p>Here, <code><em>jndi-name</em></code> is a string that can be 207 supplied to {@link javax.naming.InitialContext#bind 208 javax.naming.InitialContext.bind}.</p> 209 210 <p>As usual, the <code><em>host</em></code> and 211 <code>:<em>port</em></code> can be omitted.</p> 212 213 <p>The connector server will generate an 214 <code>RMIServerImpl</code> based on the protocol 215 (<code>rmi</code> or <code>iiop</code>) and, for 216 <code>rmi</code>, the <code><em>port</em></code> if any. When 217 the connector server is started, it will derive a stub from this 218 object using its {@link 219 javax.management.remote.rmi.RMIServerImpl#toStub toStub} method 220 and store the object using the given 221 <code><em>jndi-name</em></code>. The properties defined by the 222 JNDI API are consulted as usual.</p> 223 224 <p>For example, if the <code>JMXServiceURL</code> is: 225 226 <pre> 227 <code>service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname</code> 228 </pre> 229 230 then the connector server will generate an 231 <code>RMIJRMPServerImpl</code> and store its stub using the JNDI 232 name 233 234 <pre> 235 <code>rmi://myhost/myname</code> 236 </pre> 237 238 which means entry <code>myname</code> in the RMI registry 239 running on the default port of host <code>myhost</code>. Note 240 that the RMI registry only allows registration from the local 241 host. So, in this case, <code>myhost</code> must be the name 242 (or a name) of the host that the connector server is running 243 on. 244 245 <p>In this <code>JMXServiceURL</code>, the first <code>rmi:</code> 246 specifies the RMI 247 connector, while the second <code>rmi:</code> specifies the RMI 248 registry. 249 250 <p>As another example, if the <code>JMXServiceURL</code> is: 251 252 <pre> 253 <code>service:jmx:iiop://ignoredhost/jndi/ldap://dirhost:9999/cn=this,ou=that</code> 254 </pre> 255 256 then the connector server will generate an 257 <code>RMIIIOPServerImpl</code> and store its stub using the JNDI 258 name 259 260 <pre> 261 <code>ldap://dirhost:9999/cn=this,ou=that</code> 262 </pre> 263 264 which means entry <code>cn=this,ou=that</code> in the LDAP 265 directory running on port 9999 of host <code>dirhost</code>. 266 267 <p>If the <code>JMXServiceURL</code> is: 268 269 <pre> 270 <code>service:jmx:iiop://ignoredhost/jndi/cn=this,ou=that</code> 271 </pre> 272 273 then the connector server will generate an 274 <code>RMIIIOPServerImpl</code> and store its stub using the JNDI 275 name 276 277 <pre> 278 <code>cn=this,ou=that</code> 279 </pre> 280 281 For this case to work, the JNDI API must have been configured 282 appropriately to supply the information about what directory to 283 use. 284 285 <p>In these examples, the host name <code>ignoredhost</code> is 286 not used by the connector server or its clients. It can be 287 omitted, for example:</p> 288 289 <pre> 290 <code>service:jmx:iiop:///jndi/cn=this,ou=that</code> 291 </pre> 292 293 <p>However, it is good practice to use the name of the host 294 where the connector server is running. This is often different 295 from the name of the directory host.</p> 296 297 298 <h4>Connector server attributes</h4> 299 300 <p>When using the default JRMP transport, RMI socket factories can 301 be specified using the attributes 302 <code>jmx.remote.rmi.client.socket.factory</code> and 303 <code>jmx.remote.rmi.server.socket.factory</code> in the 304 <code>environment</code> given to the 305 <code>RMIConnectorServer</code> constructor. The values of these 306 attributes must be of type {@link 307 java.rmi.server.RMIClientSocketFactory} and {@link 308 java.rmi.server.RMIServerSocketFactory}, respectively. These 309 factories are used when creating the RMI objects associated with 310 the connector.</p> 311 312 <h3>Creating an RMI connector client</h3> 313 314 <p>An RMI connector client is usually constructed using {@link 315 javax.management.remote.JMXConnectorFactory}, with a 316 <code>JMXServiceURL</code> that has <code>rmi</code> or 317 <code>iiop</code> as its protocol.</p> 318 319 <p>If the <code>JMXServiceURL</code> was generated by the server, 320 as described above under <a href="#servergen">"connector 321 addresses generated by the server"</a>, then the client will 322 need to obtain it directly or indirectly from the server. 323 Typically, the server makes the <code>JMXServiceURL</code> 324 available by storing it in a file or a lookup service.</p> 325 326 <p>If the <code>JMXServiceURL</code> uses the directory syntax, as 327 described above under <a href="#directory">"connector addresses 328 based on directory entries"</a>, then the client may obtain it 329 as just explained, or client and server may both know the 330 appropriate directory entry to use. For example, if the 331 connector server for the Whatsit agent uses the entry 332 <code>whatsit-agent-connector</code> in the RMI registry on host 333 <code>myhost</code>, then client and server can both know 334 that the appropriate <code>JMXServiceURL</code> is:</p> 335 336 <pre> 337 <code>service:jmx:rmi:///jndi/rmi://myhost/whatsit-agent-connector</code> 338 </pre> 339 340 <p>If you have an RMI stub of type {@link 341 javax.management.remote.rmi.RMIServer RMIServer}, you can 342 construct an RMI connection directly by using the appropriate 343 constructor of {@link javax.management.remote.rmi.RMIConnector 344 RMIConnector}.</p> 345 346 347 <h3>Specifying an ORB for the RMI/IIOP connector</h3> 348 349 <p>When using the IIOP transport, the client and server can 350 specify what ORB to use 351 with the attribute <code>java.naming.corba.orb</code>. 352 Connection to the ORB happens at {@link 353 javax.management.remote.rmi.RMIConnectorServer#start() start} time 354 for the connector server, and at {@link 355 javax.management.remote.rmi.RMIConnector#connect(java.util.Map) 356 connect} time for the connector client. 357 If the <code>java.naming.corba.orb</code> attribute is contained 358 in the environment Map, then its value (an {@link 359 org.omg.CORBA.ORB ORB}), is used to connect the IIOP Stubs. 360 Otherwise, a new org.omg.CORBA.ORB is created by calling {@link 361 org.omg.CORBA.ORB 362 org.omg.CORBA.ORB.init((String[])null,(Properties)null)}. A 363 later RMI connector client or server in the same JVM can reuse 364 this ORB, or it can create another one in the same way.</p> 365 366 <p>If the <code>java.naming.corba.orb</code> attribute is 367 specified and does not point to an {@link org.omg.CORBA.ORB ORB}, 368 then an <code>{@link java.lang.IllegalArgumentException}</code> 369 will be thrown.</p> 370 371 <p>The mechanism described here does not apply when the IIOP 372 Remote objects (Stubs or Servers) are created and connected to 373 an ORB manually before being passed to the RMIConnector and 374 RMIConnectorServer.</p> 375 376 377 <h3>Dynamic code downloading</h3> 378 379 <p>If an RMI connector client or server receives from its peer an 380 instance of a class that it does not know, and if dynamic code 381 downloading is active for the RMI connection, then the class can 382 be downloaded from a codebase specified by the peer. The 383 article <a 384 href="{@docRoot}/../technotes/guides/rmi/codebase.html"><em>Dynamic 385 code downloading using Java RMI</em></a> explains this in more 386 detail.</p> 387 388 389 @see <a href="{@docRoot}/../technotes/guides/rmi/index.html"> 390 Java<sup><font size="-1">TM</font></sup> Remote Method 391 Invocation (RMI)</a> 392 393 @see <a href="{@docRoot}/../technotes/guides/jndi/index.html"> 394 Java Naming and Directory Interface<sup><font 395 size="-1">TM</font></sup> (JNDI)</a> 396 397 @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045, 398 section 6.8, "Base64 Content-Transfer-Encoding"</a> 399 400 401 @since 1.5 402 403 </body> 404 </html>