?? corba憀術厭java憀術疄緓合-java idl.txt
字號:
CORBA技術和Java技術的結合-Java IDL
一、什么是Java IDL
----Java IDL(Interface Definition Language)可實現網絡上不同平臺上的對象相互之間的交互,該技術基于通用對象請求代理體系結構CORBA規范說明。IDL是不依賴于語言的接口定義語言,所有支持CORBA的語言都有IDL到該語言的映射。就像其名字所表示的那樣,Java IDL支持到Java語言的映射。CORBA規范說明和IDL映射是由OMG(Object Management Group)定義的。OMG由700多個成員組成,Sun公司是其成員之一,它在定義IDL到Java映射的工作中起了主要作用。
----JDK1.1給Java開發人員提供了開發100%純Java分布式應用的功能,即遠程方法調用Java RMI。而Java2平臺提供的Java IDL可以在分布式應用中使用非Java語言,也就是說,Java2平臺提供的ORB(Object Request Broker)可以和任何遵從CORBA規范的ORB互操作,包括IONAT echnologies的Orbix、Visigenic Software的Visi Broker、IBM的Component Broker等。目前,主要的Web瀏覽器(MicrosoftIE4.0和NetscapeNavigator4.0)實現的主要是JDK1.1中的功能。不過,利用Sun公司提供的Java插件(Plug-in)可以使瀏覽器具備Java2平臺的所有特征。
----需要說明的是,Java2平臺提供了兩種不同的方法來構造分布式應用系統,即Java RMI和Java IDL,它們具有相似的特征和功能,Java RMI支持用Java語言寫的分布式對象,Java IDL可以與支持CORBA的任何程序設計語言如C、C++、COBOL等寫的分布式對象交互。這兩種方法各自具有不同的特點:
----(1)100%純Java和對遺產應用系統(legacy system)的支持。Java RMI是對分布式應用系統的100%純Java解決方法,具有Java的"Write once, run anywhere"的優點。用Java RMI開發的應用系統可以部署在任何支持Java運行環境的平臺上。
----相反,Java IDL是基于CORBA規范標準的技術,可以遠程調用非Java語言編寫的對象,因此Java IDL提供了對那些用非Java語言開發的遺產應用系統的支持。
----(2)使用不同的通信協議。Java RMI和Java IDL目前使用不同的通信協議,Java IDL使用CORBA/IIOP協議,IIOP(Internet Inter-ORBProtocol)協議可以使位于不同平臺上、用不同語言寫的對象以標準的方式進行通信;Java RMI目前使用Java遠程消息交換協議JRMP(Java Remote Messaging Protocol)進行通信,JRMP是專為Java的遠程對象制定的協議,不過Sun和IBM已經宣布將來會支持在RMI中使用IIOP協議,以便和遵從CORBA規范的遠程對象通信。
----(3)通過引用調用對象還是通過值調用對象。在Java IDL中,客戶端通過引用與遠程對象交互,即客戶機使用樁(Stub)對遠程服務器上的對象進行操作,但并不拷貝服務器上的對象。
----相反,RMI使得客戶機可以通過引用和遠程對象交互,也可以把遠程對象下載到客戶機運行環境進行操作,由于在RMI中使用的對象都是Java對象,因此RMI使用Java中的對象串行化(Serialization)功能在服務器和客戶機之間傳輸對象。不過CORBA規范的以后版本將包括按值調用對象的功能。
----Java RMI和Java IDL各有自己的優缺點,從某種意義上說,RMI可以看作是RPC(Remote Procedure Calls)的面向對象版本。RMI的最大優勢是可以用它來提供100%純Java的解決方案,這意味著構造RMI應用系統將比較簡單,但這也正是基于RMI的應用系統的一個缺點,即只能在Java環境中運行,不能充分利用遺產應用系統。
----Java RMI和Java IDL均可滿足一定范圍的用戶需求,都適用于一定范圍的應用,兩者之間存在著重疊,有些應用可使用兩者中的任何一種技術開發,但對于某些應用來說,采用其中的某一種比采用另一種更為恰當。
二、使用CORBA和Java IDL
----從1989年以來,OMG一直致力于開放的軟件總線體系結構CORBA的規范說明的定義,利用CORBA,不同供應商開發的、運行在不同平臺上的構件可以互操作,而不管該對象位于何處,用什么語言實現。Java IDL使得Java也支持CORBA規范說明。作為Java企業計算API的一部分,Java IDL可以保證企業異質計算中的無縫互操作性和可連接性。
----CORBA對象和一般的程序設計語言中的對象的區別在于:
CORBA對象可以位于網絡中的任何位置;
CORBA對象可以和其他平臺上的對象交互;
CORBA對象可以用任何程序設計語言編寫,只要有IDL到該語言的映射即可(目前已包括到Java、C++、C、Smalltalk、COBOL、Ada等語言的映射)。
----接口定義語言IDL用于定義CORBA對象的接口,所有的CORBA對象都支持IDL接口。IDL語法和C++非常類似,利用Java IDL,可以在Java中定義、實現、存取CORBA對象。對于每個IDL,idl to java生成一個Java接口和其他一些必要的.java文件,包括一個客戶端樁(Stub)和服務器端骨架(Skeleton)。
----為了使用Java IDL,需要有idl to java編譯器,idl to java產生和任何遵從CORBA規范的ORB一起工作的客戶端樁和服務器端骨架,Java2平臺中包括CORBAAPI和ORB,使得Java應用系統通過IIOP協議可以調用遠程的CORBA對象,JavaORB支持暫態(Transient)CORBA對象,提供了暫態名字服務器把對象組織成樹目錄結構,名字服務器遵從CORBA中COS規范說明的命名服務規范說明(Naming Service Specification)。
----圖1說明了從客戶端到服務器發送一個消息請求的過程,其中客戶端也可以是一個CORBA對象:
----客戶機不需要了解CORBA對象的位置與實現細節,也不需要了解哪個ORB用于存取對象。
----在客戶端,應用系統包括遠程對象的引用,對象引用使用樁方法作為遠程方法的代理,這個方法事實上在ORB中的,所以調用樁方法會調用ORB的連接功能,ORB會把對樁方法的調用傳遞到服務器端。
----在服務器端,ORB利用骨架代碼把遠程調用轉換成本地對象的方法調用,骨架需要對調用和參數的格式進行轉換。同時,當方法返回時,骨架對結果進行變換,然后通過ORB把結果返回給客戶機。
----不同的ORB之間通過IIOP協議進行通信,IIOP是建立在TCP/IP之上的協議。
----CORBA目前還處于發展階段,一些標準還在定義之中,但CORBA中的大部分基本結構已經定義,許多軟件供應商已根據CORBA的定義作了很多開發工作,Java IDL就是該規范說明的一個實現。但在Java2平臺中,并沒有實現CORBA規范說明中的所有特征,如:
接口庫:在一般的Java IDL操作中并不需要接口庫,Java客戶機可以存取其他的接口庫,如C++ORB提供的接口庫;
RMI/IIOP協議;
按值調用對象;
IDL中的一些類型如wchar、wstring、longdouble等。
三、IDL到Java的映射
----為了使Java支持CORBA規范說明,需要一個把IDL中的元素映射為Java中元素的標準途徑,Sun已經制訂了兩者之間的映射規則,并提供了編譯器idl to java,以便從IDL得到相應的樁和骨架。
----下表列出了一些IDL中元素和Java中元素的映射關系。
----和Java中的接口一樣,IDL接口不包含方法的具體實現,Java開發人員需在Java類中提供對這些方法的具體實現。
四、使用Java IDL開發應用的過程及實例
----用Java IDL開發分布式應用系統一般可分為五個步驟:
----1.定義遠程接口
----用IDL定義遠程對象的接口,使用IDL而不是Java語言是因為idl to java編譯器可以自動地從IDL產生Java語言的樁和骨架源文件,以及和ORB連接時所需要的一些代碼。使用IDL,開發人員可以用其他語言來實現客戶機和服務器。如果要為一個已經存在的CORBA服務實現客戶機,或為一個已經存在的客戶機實現服務,則首先要給出IDL接口,然后運行idl to java編譯器產生樁和骨架,在此基礎上再進行實現。
----2.編譯遠程接口
----在IDL文件運行idl to java編譯器,產生Java版本的接口,以及樁和骨架代碼文件,這些代碼文件使得應用程序可以和ORB相連接。
----3.實現服務器
----把idl to java編譯器產生的骨架和服務器應用程序集成在一起,除了要實現遠程接口中的方法之外,服務器代碼還要包括啟動ORB以及等待遠程客戶機的調用等部分。
----4.實現客戶機
----類似地,以樁作為客戶端應用程序的基礎,客戶機建立在樁之上,通過Java IDL提供的名字服務查詢服務器,獲得遠程對象的引用,然后調用遠程對象中的方法。
----5.啟動應用程序
----一旦實現了服務器和客戶機,就可以啟動名字服務,接著啟動服務器,然后運行客戶機。
----下面以一個經典的HelloWorld程序來說明具體的開發過程。HelloWorld包含一個操作,該操作返回一個字符串并打印出來,Client和Server之間的通信過程如下:
----(1)客戶端應用程序或小應用程序調用HelloServer的sayHello操作;
----(2)ORB把調用傳遞到已注冊的服務對象;
----(3)服務對象運行sayHello方法,返回一個Java字符串;
----(4)ORB把該字符串返回給客戶機;
----(5)客戶機打印該字符串的值。
----盡管HelloWorld程序比較簡單,但它涉及到的任務和幾乎任何一個使用CORBA靜態調用的分布式應用系統所涉及到任務相同,圖2說明了如何用CORBA在客戶機和服務器之間實現經典的"HelloWorld"程序。
----首先是定義Hello.idl,下面是用IDL描述的Hello.idl,只有一個操作(方法),該操作返回一個字符串。
Module Hello App
{
interface Hello
{
stringsay Hello ( );
};
};
----然后把Hello.idl文件映射為Java源代碼文件,用以下命令編譯Hello.idl文件:
----idl to javaHello.idl
----根據命令行中的不同選項,idl to java編譯器產生不同的文件,上面這條命令將創建子目錄HelloApp并在其中產生五個文件:_HelloImplBase.java、_HelloStub.java、Hello.java、HelloHelper.java、HelloHolder.java。
----要完成該應用程序,還要分別在這五個文件的基礎上提供服務器端和客戶機端的實現。
----CORBA服務器程序的結構和大部分Java應用程序的結構一樣,即導入所需要的包,聲明服務器類,定義main方法,處理一些例外等。另外,CORBA服務器要有一個ORB對象,每個服務器實例化一個ORB,并向其注冊服務對象,因此當ORB接收到調用請求時可以尋找到服務器。最后是服務對象的管理,服務器是一個進程,實例化了一個或多個服務對象,服務對象具體實現接口中說明的操作。HelloServer和命名服務一起工作,使得服務對象對于客戶機來說是可用的,服務器需要對名字服務的對象引用,可以向名字服務注冊,并保證向Hello接口的調用被路由到其服務對象上,最后是等待客戶機的調用。
----CORBA客戶機的結構和大部分Java應用程序的結構基本相似,即導入所需要的包、聲明應用類、定義main方法、處理一些例外等。另外和服務器程序一樣,一個CORBA客戶機也需要本地的ORB來執行所有的配置工作,每個客戶機實例化一個org.omg.CORBA.ORB對象,然后向該對象傳遞一些必要的信息以進行初始化,最后是利用ORB取得所需要的服務。一旦一個應用有了ORB,即可通過ORB來確定應用所需要的服務的位置,在本例子中即是Helloserver。為了調用CORBA對象中的操作,客戶端應用要有對該對象的引用,有很多種方法可以得到這種引用,如調用ORB.resolve_initial_references或使用其他的CORBA對象(如命名服務),當在分布式環境中沒有命名服務可用時,CORBA客戶機使用字符串化對象引用(Stringifiedobjectreference)來得到其第一個對象。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -