Java IDL——CORBA技術和Java技術的結合

來源:互聯網
上載者:User
一、什麼是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)來得到其第一個對象。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.