Java RMI(Remote Method Invocation)框架讓分布式服務與應用程式的建構變得透明化。基於 RMI 的應用由 Java 物件構成,彼此呼叫時無視對方物理位置——跨 JVM 呼叫與本地呼叫在語法上完全一致。物件間獲取引用可透過 RMI 註冊服務、方法參數傞返值傳遞。參數與返值利用 Java 序列化機制自動封送。
任何參與遠端會話的物件必須直接或間接實作 java.rmi.Remote 介面。被此介面標記的物件意味著其方法可被任意 JVM 呼叫,稱為「遠端物件」。其方法宣告需遵循三大鐵律:
throws 子句中宣告 java.rmi.RemoteException。java.io.Serializable 介面。RemoteException 的無參數建構子,確保可基於序列化狀態遠端建構。此外,遠端物件必須「導出」以接收遠端呼叫,通常透過繼承 java.rmi.server.UnicastRemoteObject 或 java.rmi.activation.Activatable 實現自動導出。
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface TimeKeeper extends Remote {
public String currentDate() throws RemoteException;
public String currentTime() throws RemoteException;
}
String 實作 Serializable,故可作為遠端方法返值。
import java.rmi.RemoteException;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class TimeKeeperImpl implements TimeKeeper {
public TimeKeeperImpl() throws RemoteException { }
public String currentDate() throws RemoteException {
Calendar cal = new GregorianCalendar();
return (cal.get(Calendar.MONTH) + "/" +
cal.get(Calendar.DAY_OF_MONTH) + "/" +
cal.get(Calendar.YEAR));
}
public String currentTime() throws RemoteException {
Calendar cal = new GregorianCalendar();
return (cal.get(Calendar.HOUR_OF_DAY) + ":" +
cal.get(Calendar.MINUTE) + ":" +
cal.get(Calendar.SECOND));
}
}
此範例展示了遠端介面與實作類別的標準結構,是建構分布式系統的基石。