遠端方法呼叫(RMI)是 Java 平台建構分散式運算的核心基礎。EJB 架構於 RMI 之上,而 Web Service 則是另一種日益流行的選擇。掌握 RMI 不僅能理解 J2EE 底層機制,更能以輕量方式解決科學運算、SETI 式分散式計算等場景需求。
public interface IServer extends Remote {
void doSomeThing() throws RemoteException;
}
關鍵:繼承 Remote、方法拋出 RemoteException。
public class ServerImp extends UnicastRemoteObject implements IServer {
public ServerImp() throws RemoteException { super(); }
public void doSomeThing() throws RemoteException {
System.out.println("遠端方法在伺服端執行");
}
public static void main(String[] args) {
ServerImp server = new ServerImp();
Naming.rebind("//localhost/MyServer", server); // 註冊至 RMI Registry
}
}
繼承 UnicastRemoteObject 獲得遠端參考能力,main() 中透過 Naming.rebind() 發布服務。
public class Client {
public static void main(String[] args) {
IServer server = (IServer) Naming.lookup("//localhost/MyServer");
server.doSomeThing(); // 透過介面呼叫遠端方法
}
}
客戶端僅依賴介面,透過 lookup 取得遠端參考(Stub)。
rmiregistryrmic ServerImpjava rmistudy.ServerImpjava rmistudy.Client

物件完整序列化傳至遠端,遠端呼叫其方法在「伺服端」執行。適用於資料傳輸物件(DTO)。
public interface ISerializableWorker extends Serializable { void work(); }
String doSomeThing(ISerializableWorker wk) { wk.work(); return "結果"; }
僅傳遞 Stub 參考,遠端呼叫其方法在「客戶端」執行。適用於回呼、事件通知。
public interface IRefWorker extends Remote { void work() throws RemoteException; }
public class RefWorkerImp extends UnicastRemoteObject implements IRefWorker { ... }
void doSomeThing(IRefWorker wk) { wk.work(); } // 在客戶端執行
分散式環境必須配置 SecurityManager 與政策檔:
// Policy.txt
grant { permission java.security.AllPermission "", ""; };
// 伺服端 main() 加入
System.setSecurityManager(new RMISecurityManager());
啟動參數:java -Djava.security.policy=Policy.txt rmistudy.ServerImp

RMI 雖屬 J2EE 基礎設施,但獨立價值顯著:輕量分散式計算平台、科學運算叢集、跨實驗室資源整合。中國大型機資源相對稀缺,參考 SETI@home 模式,利用 RMI 建構桌面電腦分散式運算網絡,是極具性價比的選擇。分階段掌握 J2EE 各層技術(RMI、JMS、Web Service、EJB),按需選擇而非盡追大而全,是務實架構師的智慧。