用RMI實現基於Java的分散式計算(轉)

ba發表於2007-08-15
用RMI實現基於Java的分散式計算(轉)[@more@]Java 2 Enterprise Edition(J2EE)遠端方法呼叫(Remote Method Invocation,RMI)框架允許你建立透明的、分散式的服務和應用程式。基於RMI的應用程式由Java物件構成,這些物件相互呼叫,同時忽略對方的位置。換言之,一個Java物件可呼叫另一個虛擬機器上的某個Java物件的方法,整個過程和呼叫同一個虛擬機器上的某個Java物件的方法無異。駐留在不同虛擬機器上的物件為了相互獲得引用,可以使用RMI的查詢服務,或者將物件引用作為方法呼叫的一個引數或者返回值來接收。引數和返回值藉助Java的物件序列化機制由RMI來進行封送。
遠端物件和介面
Java提供了一個完全限定名稱為java.rmi.Remote的介面。任何物件要想參與和另一個Java物件的遠端會話,就必須直接或間接地實現該介面。尤其要注意的是,任何由java.rmi.Remote介面來標識的物件都暗示著它的方法可從其他任何虛擬機器進行呼叫。實現了 java.rmi.Remote介面的物件通常稱為“遠端物件”,必須採用以下方式來宣告它的方法:
? 每個支援遠端呼叫的方法都必須在其throws子句中宣告java.rmi.RemoteException。
? 對於一個可遠端呼叫的方法,它的每個非基本(nonprimitive)引數或者返回值都必須直接或間接地宣告為實現了java.io.Serializable介面。
除了實現java.rmi.Remote介面和正確宣告任何遠端方法之外,遠端物件必須提供一個無引數的建構函式,它能引發一個java.rmi.RemoteException異常。這就保證了物件可基於一種序列化狀態來遠端構造。
遠端物件必須匯出,以接收傳入的遠端方法呼叫。為此,你通常需要擴充套件java.rmi.server.UnicastRemoteObject或者java.rmi.activation.Activatable。透過對其中任何一個類進行擴充套件,遠端物件就可在建立時自動匯出。

以下介面定義展示了java.rmi.Remote介面最典型的用法:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface TimeKeeper extends Remote
{
public String currentDate() throws RemoteException;
public String currentTime() throws RemoteException;
}
由於String類宣告為實現了java.io.Serializable介面,所以String是遠端方法的有效返回型別。
以下程式碼展示瞭如何實現TimeKeeper介面,以便定義一個有效的遠端物件:


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();
String retVal = (cal.get(Calendar.MONTH) + "/" +
cal.get(Calendar.DAY_OF_MONTH) + "/" +
cal.get(Calendar.YEAR));
return retVal;
}
public String currentTime() throws RemoteException
{
Calendar cal = new GregorianCalendar();
String retVal = (cal.get(Calendar.HOUR_OF_DAY) + ":" +
cal.get(Calendar.MINUTE) + ":" +
cal.get(Calendar.SECOND));
return retVal;
}
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958145/,如需轉載,請註明出處,否則將追究法律責任。

相關文章