1. 程式人生 > >CORBA技術和Java技術的結合-Java IDL

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)來得到其第一個物件。