RMI (Remote Method Invocation) 將面向對象思想延伸至分佈式環境:調用對象可在本機,亦可在遠程主機。
import java.rmi.*;
public interface Product extends Remote {
String getDescription() throws RemoteException;
}
關鍵規則:
java.rmi.RemoteRemoteException(網絡不可靠性)import java.rmi.server.*;
import java.rmi.*;
public class ProductImpl extends UnicastRemoteObject implements Product {
private String desc;
public ProductImpl(String name) throws RemoteException {
this.desc = name;
}
public String getDescription() throws RemoteException {
return "This is " + desc + " product";
}
}
繼承 UnicastRemoteObject 即可獲得 RMI 服務器能力,業務邏輯與本地對象無異。
import java.rmi.*;
public class ProductServer {
public static void main(String[] args) {
try {
System.out.println("Constructing server implementations...");
ProductImpl p1 = new ProductImpl("toaster");
ProductImpl p2 = new ProductImpl("microwave");
System.out.println("Binding to registry...");
Naming.rebind("toaster", p1);
Naming.rebind("microwave", p2);
System.out.println("Waiting for clients...");
} catch (Exception e) {
System.out.println("Error: " + e);
}
}
}
Naming.rebind() 將對象綁定至 RMI 註冊表,客戶端通過名稱查找。
rmic 工具自動生成(rmic ProductImpl)rmiregistry(默認端口 1099)java.security.policy 文件授予權限Serializablermic 生成 Stub/SkeletonrmiregistryProductServer)Naming.lookup() 獲取遠程引用)