RMI-IIOP
外觀
| 導航 併發程式設計 主題: |
| 一位華夏公益教科書使用者建議將本書或章節合併到 Java 程式設計/遠端方法呼叫 中。 請在 討論頁面 上討論是否應該進行此合併。 |
RMI-IIOP (透過 IIOP 的 RMI) 與 Java SDK 一起提供。它將遠端方法呼叫 (RMI) 技術與 Internet 互操作軌道協議 (IIOP) 相結合,為 Java 平臺提供 CORBA。Java 開發人員無需提供 IDL 即可提供 CORBA 功能。
程式碼清單 7.1:HowdyInterface.java
import java.rmi.Remote;
public interface HowdyInterface extends java.rmi.Remote {
public void sayHowdy() throws RemoteException;
}
|
上面的程式碼定義了一個名為 HowdyInterface 的遠端介面,它將定義遠端客戶端可以在伺服器上呼叫的內容。所有操作都必須丟擲 RemoteException。該介面必須擴充套件 java.rmi.Remote。
程式碼清單 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!!");
}
}
|
實現類允許物件進行 ORB 初始化。它還實現了要呼叫的遠端操作。實現可以擴充套件 PortableRemoteObject,在這種情況下,建構函式中的 exportObject 呼叫將被刪除。更好的方法似乎是像上面程式碼中那樣。
程式碼清單 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 );
}
}
|
程式碼清單 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;
}
}
}
|
客戶端程式碼使用名稱服務查詢伺服器並進行遠端呼叫。
