CORBA and RMI-IIOP
與corba聯合使得EJB的客戶可以方便的移植corba應用程序。使EJB與已存在的非Java語言的(例如C++、COBOL)現有系統整合起來。實事上,Corba和EJB有非常密切的聯系。J2EE中許多的概念來源於corba.
Corba是EJB的基礎
許多的EJB的概念都來自於corba。EJB和J2EE帶來的是Java為中心的,基於組件的,適合快速應用開發的中間件程序結構。使用corba,要求寫復雜的中間件API的程序,這無疑要求增加對於corba程序的了解程度。這就是為什麼EJB和J2EE比corba更時候快速開發的原因。因為EJB正式被行業支持。(有25家之多正在同時開發EJB產品)。
盡管如此,corba還是非常重要的技術。對高級中間件開發非常有用。事實上,市場上大多數的EJB產品都基於corba,同時也在大量的使用corba的概念。
我們為什麼要關心corba
You can use CORBA for legacy integration.
CORBA allows for advanced middleware development.
CORBA and EJB have hooks connecting them.
使用corba的益處
corba不受某個公司控制
corba是獨立於語言的
Corba提供增加服務的可選性
Corba的缺點
Corba的發展受到限制:因為是一個組織,因此對於某些新特征,OMG采用的比較慢。
Corba不宜於學習
基於corba的產品可以有不協調的特征。
Corba如何工作
The ORB facilitates your networking needs.
對象實現和對象參考
對象適配器
倉庫:接口倉庫和實現倉庫
OMG的接口定義語言
語言映射(idl-Java/idl-c++)
靜態調用
Calling a method in CORBA.
動態調用
corba的各種服務
名字服務/事件服務/對象事務服務/並發控制服務/安全服務
corba組件
參考規范ftp://FTP.omg.org/pub/docs/orbos/98-12-02.pdf
IIOP之上的RMI
RMI和corba協同性的需要
Corba是分布式對象的標准,RMI可以方便的建立基於java的簡單分布式對象通訊。RMI沒有corba的多語言性,但非常適合純Java的開發。
雖然RMI和corba非常相似,但它們也有不相容的一面,當用Java RMI編寫代碼時,需要使用RMI API。而用corba編代碼時,必須使用corba API。這對於代碼重用是非常不利的。理想上,我們希望:
將客戶端Java RMI與服務端的corba結合:可以通過corba API寫對象實現,用RMI API寫的客戶端代碼可以調用corba對象。
RMI的客戶端調用corba對象的實現
反之也可以。
A CORBA clIEnt calling an RMI remote object implementation.
Corba和rmi的結合
Corba和rmi使用預生成的stubs和skeletons執行網絡通訊。
在幕後,corba使用iiop作為執行C/S通訊的協議。這在stub/skeleton層之下。
在幕後,java RMI使用Java遠程方法調用協議(JRMP)執行C/S通訊,這在stub/skeleton層之下。
因此,corba和rmi在如何執行遠程調用是非常相似的。它們都有一個API(stub/skeletons)層。分別通過iiop和jrmp傳輸數據。
因此協議的使用成為corba和rmi協同的關鍵。Rmi總是期待著通過jrmp協議的請求,而corba則期待iiop協議的請求。要實現兩種協議的切換,可以執行:
1、 rmi客戶端使用rmi api編寫。在rmi stub上調用一個方法。
2、 rmi stub聯系一個本地的orb,使用iiop作為服務方通訊的本地協議,代替標准的jrmp協議。
3、 在服務方,orb等待接受iiop的請求,orb是對於corba對象實現的純的corba skeleton。Orb接收請求。因為使用iiop,請求看來好像來自corba的客戶端。事實上它來自使用iiop協議的rmi客戶端
4、 orb傳遞請求給corba skeleton,這代表著corba對象實現的調用。
5、 當調用完成時,返回的結果被回饋給純corba skeleton。Orb將結果送回iiop.
6、 客戶端的orb接受通過iiop返回的結果,返回給rmi客戶端的stub然後將控制權返回給rmi的客戶代碼。
這樣是完美的。因為它使用Java客戶端通過rmi api調用corba對象上的方法,相反,也是完美的。
Iiop之上的rmi的優點:
Rmi和corba代碼實現了可復用性。
可已用多種語言來寫代碼調用rmi對象實現。
Rmi客戶端可以被整合到系統中去。
IIOP gives RMI robust firewall navigation.
IIOP gives RMI a portable way to propagate contexts.
RMI object implementations can be invoked dynamically.
整合rmi和corba時出現的問題
參數傳遞約定的不同
解決辦法:The OMG Objects-by-Value Specification
If the parameter is primitive or implements Java.io.Serializable, it is
passed by value.
If the parameter implements Java.rmi.Remote, it is passed by reference.
Rmi和corba語義的不同
Distributed garbage collection.
Narrowing.
Java RMI programmers don’t want to learn OMG IDL.
解決辦法:The Java-to-IDL Mapping Specification
rmi和corba協同工作的實例:
帶corba對象實現的rmi-iiop客戶端
1、 寫rmi遠程接口
2、 生成iiop stubs之上的客戶端rmi
3、 生成omg idl
4、 生成服務器端需要的corba文件
5、 書寫客戶端和服務端
帶rmi-iiop對象實現的corba客戶端
1、 寫rmi遠程接口
2、 生成iiop skeleton之上的服務端rmi
3、 生成omg idl
4、 生成所需的客戶端corba文件
5、 寫客戶和服務端
使用rmi-iiop可能的組合
rmi-iiop API
Javax.rmi.
Javax.rmi.CORBA.
iiop之上的rmi客戶端怎樣找到網絡上的對象呢?客戶端可以使用rmi的naming.lookup()找到對象。
Corba和ejb整合
Corba和ejb整合的優點
這正在發展的幼年期。
Corba和ejb整合的設想
基於corba的ejb服務端
純粹的ejb服務端
Java RMI-IIOP clIEnt with a CORBA-based EJB server.