??????? 眾所周之的EJB機(jī)制是建立在Java的RMI的基礎(chǔ)之上的,要想對EJB有深入的了解,必須掌握RMI的運(yùn)行機(jī)制,在此,我說說我對RMI的一些理解,希望大家同意的和不同意的都站出來講幾句。
?????? Rmi是Java平臺上的RPC,但是由于其只支持Java,所以也就免去了程序員編寫IDL(接口定義語言)之苦。對于Java與非Java程序之間的通信,可以使用RMI-IIOP.
??????? 創(chuàng)建RMI遠(yuǎn)程對象后,程序員就可以象調(diào)用本地對象那樣去調(diào)用遠(yuǎn)程對象,其底層通信機(jī)制則完全由RMI實(shí)現(xiàn),無須我們操心了。
??????? 通常,實(shí)現(xiàn)一個RMI系統(tǒng)有4個步驟:
1:定義一個remote interface.
2:?? 定義一個remote object implementation.
3:? ?定義客戶端程序。
4:編譯執(zhí)行遠(yuǎn)程對象和客戶端。
以下為代碼示例
1:Remote接口? (注意:必須extends Remote,方法必須throws RemoteException)
public?interface?RMI_Add?extends?java.rmi.Remote?{
public?long?add(long?a,?long?b,long?c)
throws?java.rmi.RemoteException;
}
2:?? remote object implementation.(注意:1:extends UnicastRemoteObject 2:構(gòu)造函數(shù)內(nèi)必須調(diào)用UnicastRemoteObject的構(gòu)造函數(shù),也就是執(zhí)行super())
3: 定義遠(yuǎn)程實(shí)現(xiàn)類,在此我把服務(wù)器的綁定一起在此類中實(shí)現(xiàn),也可另外再寫一個類,實(shí)現(xiàn)RMI綁定。(注意:一般都用Naming.rebind(),因?yàn)閞ebind()可以覆蓋原有的服務(wù)名,省去不必要的麻煩。1099端口為默認(rèn),也可以不寫)
inport java.rmi.Naming;
public?class?RMI_AddImpl?extends java.rmi.server.UnicastRemoteObject implements?RMI_Add {
?public?RMI_AddImpl() throws?java.rmi.RemoteException?{
super();
}
public?long?add(long?a,?long?b,long?c?) throws?java.rmi.RemoteException?{
return?a?+?b+?c;
}
public static void main(String[] args) {
? try?{
RMI_Add?d?=?new?RMI_AddImpl();
Naming.rebind("rmi://10.7.3.168:1099/RMI_AddService",?d);
}?catch?(Exception?e)?{?}
}
}
4:編譯以上class文件(Javac)
5:?? rmic編譯服務(wù)器實(shí)現(xiàn)類,在此是RMI_AddImpl?。
6:rmigistry:運(yùn)行RMI注冊程序.
7:? 運(yùn)行客戶端代碼。