RMI-IIOP
Navigate Concurrent Programming topic: ) |
A Wikibookian suggests that this book or chapter be merged into Java Programming/Remote Method Invocation. Please discuss whether or not this merge should happen on the discussion page. |
RMI-IIOP (RMI over IIOP) is provided with the Java SDK. It combines Remote Method Invocation (RMI) technology with the Internet Inter-Orb Protocol (IIOP) to provide CORBA to the Java platform. Java developers do not have to provide IDL in order to provide CORBA capabilities.
The Remote Interface
editCode listing 7.1: HowdyInterface.java
import java.rmi.Remote;
public interface HowdyInterface extends java.rmi.Remote {
public void sayHowdy() throws RemoteException;
}
|
The above code defines a remote interface called HowdyInterface that will define what the remote client may call on the server. All of the operations must throw a RemoteException. The interface must extend java.rmi.Remote.
The Implementation Class
editCode listing 7.2: HowdyImpl.java
import javax.rmi.PortableRemoteObject;
import javax.rmi.RemoteException;
public class HowdyImpl implements HowdyInterface {
public HelloImpl() throws java.rmi.RemoteException {
PortableRemoteObject.exportObject(this); // Initializes the remote object
}
public void sayHowdy() throws RemoteException {
System.out.println("Weeee doggies! Howdy!!");
}
}
|
The implementation class allows for the object to be ORB-initialized. It also implements the remote operation to be called. The implementation could have extended PortableRemoteObject
, in which case the exportObject
call in the constructor would be removed. The better approach would seem to be as coded above.
The Server Class
editCode listing 7.3: HowdyServer.java
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.rmi.PortableRemoteObject ;
import com.sun.corba.se.internal.POA.POAORB;
import org.omg.PortableServer.*;
import java.util.*;
import org.omg.CORBA.*;
import javax.rmi.CORBA.Stub;
import javax.rmi.CORBA.Util;
public class HowdyServer {
public HowdyServer(String[] args) {
try {
Properties p = System.getProperties();
// add runtime properties here
p.put("org.omg.CORBA.ORBClass",
"com.sun.corba.se.internal.POA.POAORB");
p.put("org.omg.CORBA.ORBSingletonClass",
"com.sun.corba.se.internal.corba.ORBSingleton");
ORB orb = ORB.init( args, p );
POA rootPOA = (POA)orb.resolve_initial_references("RootPOA");
Policy[] tpolicy = new Policy[3];
tpolicy[0] = rootPOA.create_lifespan_policy(
LifespanPolicyValue.TRANSIENT );
tpolicy[1] = rootPOA.create_request_processing_policy(
RequestProcessingPolicyValue.USE_ACTIVE_OBJECT_MAP_ONLY );
tpolicy[2] = rootPOA.create_servant_retention_policy(
ServantRetentionPolicyValue.RETAIN);
POA tPOA = rootPOA.create_POA("MyTransientPOA", null, tpolicy);
tPOA.the_POAManager().activate();
HowdyImpl howdyImpl = new HowdyImpl();
_HowdyImpl_Tie tie = (_HowdyImpl_Tie)Util.getTie( howdyImpl );
String howdyId = "howdy";
byte[] id = howdyId.getBytes();
tPOA.activate_object_with_id( id, tie );
Context initialNamingContext = new InitialContext();
initialNamingContext.rebind("HowdyService",
tPOA.create_reference_with_id(id,
tie._all_interfaces(tPOA,id)[0]) );
System.out.println("Howdy Server: Ready...");
orb.run();
}
catch (Exception e) {
System.out.println("Error running HowdyServer: " + e);
e.printStackTrace();
}
}
public static void main(String args[]) {
new HowdyServer( args );
}
}
|
The Client Class
editCode listing 7.4: HelloClient.java
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import javax.rmi.*;
import java.util.Vector;
import javax.naming.NamingException;
import javax.naming.InitialContext;
import javax.naming.Context;
public class HelloClient {
public static void main( String args[] ) {
Context ic;
Object objref;
HelloInterface hi;
try {
ic = new InitialContext();
} catch (NamingException e) {
System.out.println("failed to obtain context" + e);
e.printStackTrace();
return;
}
try {
objref = ic.lookup("HowdyService");
System.out.println("Client: Obtained a reference to Howdy server.");
} catch (NamingException e) {
System.out.println("failed to lookup object reference");
e.printStackTrace();
return;
}
try {
hi = (HowdyInterface) PortableRemoteObject.narrow(
objref, HowdyInterface.class);
hi.sayHowdy();
} catch (ClassCastException e) {
System.out.println("narrow failed");
e.printStackTrace();
return;
} catch( Exception e ) {
System.err.println( "Exception " + e + "Caught" );
e.printStackTrace( );
return;
}
}
}
|
The client code uses the name service to look up the server and make the remote invocation.