第三章 中間件簡單Corba程序設計_第1頁
第三章 中間件簡單Corba程序設計_第2頁
第三章 中間件簡單Corba程序設計_第3頁
第三章 中間件簡單Corba程序設計_第4頁
第三章 中間件簡單Corba程序設計_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、山東大學計算機科學與技術(shù)學院基礎技術(shù)教學部第三章第三章簡單簡單Corba程序設計程序設計山東大學計算機科學與技術(shù)學院1 CORBA應用開發(fā)過程應用開發(fā)過程CORBA規(guī)范并沒有限制規(guī)范并沒有限制ORB的具體實現(xiàn)方法,所的具體實現(xiàn)方法,所以不同廠商對以不同廠商對ORB的具體實現(xiàn)方法可能差別很大,的具體實現(xiàn)方法可能差別很大,這就導致不同廠商提供的這就導致不同廠商提供的ORB上操作可能有很大的上操作可能有很大的差異。但基本過程都是類似的。差異。但基本過程都是類似的。山東大學計算機科學與技術(shù)學院1.1 開發(fā)環(huán)境開發(fā)環(huán)境Inprise VisiBroker 4.5 + JDK 1.3 + UltraEdi

2、tJacORB3.6 + JDK 1.6 +Ant1.7+Eclipse山東大學計算機科學與技術(shù)學院1.2 靜態(tài)工作方式靜態(tài)工作方式客戶方對象實現(xiàn)方IDL樁(客戶方代理)IDL構(gòu)架(服務方代理)ORB內(nèi)核山東大學計算機科學與技術(shù)學院設計一個靜態(tài)方式的程序設計一個靜態(tài)方式的程序IDL文件對象實現(xiàn)IDL編譯器JavaC+IDL樁JavaC+IDL構(gòu)架JavaC+客戶方調(diào)用服務方主程序山東大學計算機科學與技術(shù)學院1.4典型的典型的CORBA應用實現(xiàn)過程應用實現(xiàn)過程用用IDL編寫對象規(guī)格說明編寫對象規(guī)格說明編譯編譯IDL生成樁和框架生成樁和框架編寫客戶程序代碼編寫客戶程序代碼編寫對象實現(xiàn)和服務程序代碼

3、編寫對象實現(xiàn)和服務程序代碼編譯客戶程序編譯客戶程序編譯服務程序編譯服務程序運行客戶程序運行客戶程序運行服務程序運行服務程序啟動對象請求代理(啟動對象請求代理(ORB)內(nèi)核)內(nèi)核一個典型CORBA應用的實現(xiàn)過程山東大學計算機科學與技術(shù)學院對象接口對象接口對象接口實際上是分布式對象向外提供服務的規(guī)格對象接口實際上是分布式對象向外提供服務的規(guī)格說明說明是客戶程序與對象實現(xiàn)之間的一種合約,雙方必須是客戶程序與對象實現(xiàn)之間的一種合約,雙方必須嚴格遵守對象接口定義中的約定,包括操作名字,嚴格遵守對象接口定義中的約定,包括操作名字,參數(shù)表,返回表,異常表,上下文等參數(shù)表,返回表,異常表,上下文等對象接口定義

4、存放在一個或多個對象接口定義存放在一個或多個IDL文本文件中,文本文件中,指明每一對象對外提供的服務,以及客戶程序如何指明每一對象對外提供的服務,以及客戶程序如何使用這些服務或處理服務的返回結(jié)果使用這些服務或處理服務的返回結(jié)果山東大學計算機科學與技術(shù)學院1.3 IDL語言語言說明性語言,定義組件接口,不定義實現(xiàn)。說明性語言,定義組件接口,不定義實現(xiàn)。語法上可以看成語法上可以看成C+的一個子集,規(guī)定組件的屬性、所繼承的一個子集,規(guī)定組件的屬性、所繼承的父類、產(chǎn)生的異常、事件和各類數(shù)據(jù)類型。的父類、產(chǎn)生的異常、事件和各類數(shù)據(jù)類型。編譯器作用:將編譯器作用:將IDL映射到具體程序設計語言,產(chǎn)生樁代碼

5、映射到具體程序設計語言,產(chǎn)生樁代碼和框架代碼和框架代碼調(diào)用請求經(jīng)客戶端樁傳遞給調(diào)用請求經(jīng)客戶端樁傳遞給ORB,然后轉(zhuǎn)發(fā)到服務端框架,然后轉(zhuǎn)發(fā)到服務端框架,最后到達真正要執(zhí)行請求的對象實現(xiàn)實例最后到達真正要執(zhí)行請求的對象實現(xiàn)實例山東大學計算機科學與技術(shù)學院編寫對象實現(xiàn)和服務程序編寫對象實現(xiàn)和服務程序IDL文件只定義了對象的語法規(guī)格說明,必須編寫這些對象文件只定義了對象的語法規(guī)格說明,必須編寫這些對象的具體實現(xiàn)代碼的具體實現(xiàn)代碼對象實現(xiàn)可用各種語言實現(xiàn),且與客戶程序的語言無關(guān)對象實現(xiàn)可用各種語言實現(xiàn),且與客戶程序的語言無關(guān)IDL到編程語言的映射規(guī)則到編程語言的映射規(guī)則 生成生成IDL框架代碼和各種

6、輔助性的框架代碼和各種輔助性的java接口或類接口或類 編寫對象實現(xiàn)代碼時必須繼承或使用其中的某些接口或類編寫對象實現(xiàn)代碼時必須繼承或使用其中的某些接口或類服務程序服務程序 利用利用POA激活伺服對象供客戶對象使用激活伺服對象供客戶對象使用 通常是一個循環(huán)執(zhí)行的進程,不斷監(jiān)聽客戶程序請求并為之服務通常是一個循環(huán)執(zhí)行的進程,不斷監(jiān)聽客戶程序請求并為之服務山東大學計算機科學與技術(shù)學院編寫客戶程序編寫客戶程序初始化初始化ORB 是應用程序進入是應用程序進入CORBA的起點的起點 作用作用讓ORB了解有新的成員加入獲取ORB偽對象的引用,以備調(diào)用ORB內(nèi)核提供的操作時使用 偽對象偽對象(pseudo

7、object):在:在CORBA基礎設施中的一個對象基礎設施中的一個對象獲取分布式對象引用,利用其調(diào)用對象實現(xiàn)提供的獲取分布式對象引用,利用其調(diào)用對象實現(xiàn)提供的服務服務山東大學計算機科學與技術(shù)學院創(chuàng)建并部署應用程序創(chuàng)建并部署應用程序客戶端:客戶程序代碼與客戶端:客戶程序代碼與IDL編譯器自動生成的編譯器自動生成的IDL樁代碼一起編譯樁代碼一起編譯服務端:對象實現(xiàn)代碼與服務程序代碼與服務端:對象實現(xiàn)代碼與服務程序代碼與IDL框架框架代碼一起編譯代碼一起編譯山東大學計算機科學與技術(shù)學院1.5 例子背景例子背景銀行賬戶管理銀行賬戶管理 服務端管理大量銀行顧客的賬戶,提供基本的開戶、存款、取服務端管理

8、大量銀行顧客的賬戶,提供基本的開戶、存款、取款、查詢余額的功能。款、查詢余額的功能。山東大學計算機科學與技術(shù)學院1.5.1 對象認定對象認定一個銀行帳戶的實體模型一個銀行帳戶的實體模型。balance:表示當前的余額表示當前的余額。deposit:存款:存款withdraw:取款:取款getBalance:查詢余額:查詢余額manage銀行中的儲蓄員的實體模型。accountList :記錄當前已開設的所有帳戶。open:根據(jù)帳戶標識查找某一帳戶,如果該標識的帳戶不存在則創(chuàng)建一個新帳戶。山東大學計算機科學與技術(shù)學院1.5.2 定義對象接口定義對象接口/ 銀行帳戶管理系統(tǒng)的對象接口定義modul

9、e Bank / 帳戶 interface Account / 存款 void deposit(in float amount); / 取款 boolean withdraw(in float amount); / 查詢余額 float getBalance(); ; / 帳戶管理員 interface AccountManager / 查詢指定名字的帳戶,查無則新開帳戶 Account open(in string name); ; Bank.idl山東大學計算機科學與技術(shù)學院1.5.3 生成生成Stub與與SkeletonIDL編譯器作用是將編譯器作用是將IDL映射到具體程序設計語言,產(chǎn)生

10、樁映射到具體程序設計語言,產(chǎn)生樁代碼和框架代碼代碼和框架代碼Visibroker for java提供的編譯器提供的編譯器idl2java將將IDL映射到映射到java語語言,生成言,生成java語言的樁和框架語言語言的樁和框架語言每個對象實例都有一個用于唯一標識自身的對象引用??蛻裘總€對象實例都有一個用于唯一標識自身的對象引用??蛻舫绦蚶脤ο笠弥该髡{(diào)用的方向程序利用對象引用指明調(diào)用的方向表面上看,客戶程序調(diào)用的是遠程對象實現(xiàn)上的操作,實際表面上看,客戶程序調(diào)用的是遠程對象實現(xiàn)上的操作,實際被調(diào)用的代碼是作為其代理的被調(diào)用的代碼是作為其代理的IDL樁樁山東大學計算機科學與技術(shù)學院生成生成S

11、tub與與Skeletonprompt idl2java Bank.idlidl2javaBank.idlStubSkeleton輸入輸入輸出輸出其它輔助其它輔助文件文件山東大學計算機科學與技術(shù)學院1.5.4 生成生成7個文件個文件VisiBroker for Java的的IDL編譯器編譯器idl2java為為每個接口每個接口自動生成自動生成7個文件:個文件: AccountOperations.java Account.java _AccountStub.java AccountPOA.java AccountPOATie.java AccountHelper.java AccountHol

12、der.java 山東大學計算機科學與技術(shù)學院1.5.4.1 生成的接口定義生成的接口定義Account.java和和AccountOperations.java定義了定義了IDL接口接口Account的完整基調(diào)的完整基調(diào)。 AccountOperations.java(操作基調(diào)操作基調(diào))定義了定義了Account接口中定義接口中定義的所有常量和方法。的所有常量和方法。package Bank; public interface AccountOperations/操作接口 public void deposit(float amount); public boolean withdraw(f

13、loat amount); public float getBalance();山東大學計算機科學與技術(shù)學院生成的接口定義生成的接口定義 客戶程序代碼中,程序員通常使用的是操作接口的派生接口客戶程序代碼中,程序員通常使用的是操作接口的派生接口Account(位于位于Account.java)package Bank; public interface Account extends com.inprise.vbroker.CORBA.Object, Bank.AccountOperations, org.omg.CORBA.portable.IDLEntity 山東大學計算機科學與技術(shù)學院1.

14、5.4.2 生成的生成的Stub_AccountStub.java是是Account對象在客戶端的樁代碼,對象在客戶端的樁代碼,它實現(xiàn)了它實現(xiàn)了Account接口接口。程序員編寫的客戶程序代碼通常不直接調(diào)用這個程序員編寫的客戶程序代碼通常不直接調(diào)用這個類中的方法的方法。 VisiBroker for Java生成了另外的輔助類生成了另外的輔助類AccountHelper。山東大學計算機科學與技術(shù)學院生成的生成的Stubpackage Bank; public class _AccountStub extends com.inprise.vbroker.CORBA.portable.Object

15、Impl implements Account final public static java.lang.Class _opsClass = Bank.AccountOperations.class; private static java.lang.String _ids = IDL:Bank/Account:1.0; public java.lang.String _ids() return _ids; public void deposit(float amount) /與ORB交互,完成真正的deposit方法調(diào)用 public boolean withdraw(float amou

16、nt) /與ORB交互,完成真正的withdraw方法調(diào)用 public float getBalance() /與ORB交互,完成真正的getBalance方法調(diào)用 _AccountStub.java山東大學計算機科學與技術(shù)學院1.5.4.3 生成的生成的SkeletonAccountPOA.java是是Account對象的服務端框架代碼,對象的服務端框架代碼,該類的功能該類的功能:解包解包in類型的參數(shù)并將參數(shù)傳遞給對象實現(xiàn)類型的參數(shù)并將參數(shù)傳遞給對象實現(xiàn)。打包返回值與所有打包返回值與所有out類型的參數(shù)。類型的參數(shù)。打包(marshal):指將特定程序設計語言描述的數(shù)據(jù)類型轉(zhuǎn)換為CORB

17、A的IIOP流格式。解包(unmarshal):從IIOP流格式轉(zhuǎn)換為依賴于具體程序設計語言的數(shù)據(jù)結(jié)構(gòu)。編寫對象實現(xiàn)的最簡單途徑是繼承這些編寫對象實現(xiàn)的最簡單途徑是繼承這些POA類,即類,即把它們作為對象實現(xiàn)的基類。把它們作為對象實現(xiàn)的基類。山東大學計算機科學與技術(shù)學院生成的生成的Skeletonpackage Bank; public abstract class AccountPOA extends org.omg.PortableServer.Servant implements org.omg.CORBA.portable.InvokeHandler, Bank.AccountOper

18、ations public static org.omg.CORBA.portable.OutputStream _invoke( .) org.omg.CORBA.portable.OutputStream _output = null; switch (_method_id) case 0: float amount; amount = _input.read_float(); _self.deposit(amount); _output = _handler.createReply(); return _output; case 1: /. case 2: /. AccountPOA.j

19、ava山東大學計算機科學與技術(shù)學院1.5.4.4 生成的輔助工具類生成的輔助工具類 IDL編譯器為每一個用戶自定義類型還生成一個輔助工具類。編譯器為每一個用戶自定義類型還生成一個輔助工具類。AccountHelper.java聲明了聲明了AccountHelper類,該類為類,該類為Account接口定義了許多實用功能和支持功能的靜態(tài)方法(又稱類方接口定義了許多實用功能和支持功能的靜態(tài)方法(又稱類方法)。法)。 從從Any對象提取或向?qū)ο筇崛』蛳駻ny對象插入對象(對象插入對象(extract和和insert方法);方法); 從輸入輸出流讀寫對象(從輸入輸出流讀寫對象(read和和write方

20、法);方法); 獲取對象的庫標識和類型碼(獲取對象的庫標識和類型碼(id和和type方法);方法); 綁定對象與類型轉(zhuǎn)換操作(綁定對象與類型轉(zhuǎn)換操作(bind和narrow方法)等等。)等等。編程時會用到該類中提供的方法。編程時會用到該類中提供的方法。山東大學計算機科學與技術(shù)學院生成的輔助工具類生成的輔助工具類package Bank; public final class AccountHelper public static Bank.Account narrow(final org.omg.CORBA.Object obj) /. public static Bank.Account b

21、ind(org.omg.CORBA.ORB orb, java.lang.String name) /. /. AccountHelper.java山東大學計算機科學與技術(shù)學院1.5.4.5 生成的對象傳遞支撐類生成的對象傳遞支撐類AccountHolder.java聲明的聲明的AccountHolder類為傳遞類為傳遞對象提供支持對象提供支持。 IDL有三種參數(shù)傳遞方式:有三種參數(shù)傳遞方式:in、out和和inout。 in類型的參數(shù)以及返回結(jié)果與類型的參數(shù)以及返回結(jié)果與Java的參數(shù)傳遞方式與結(jié)果返回的參數(shù)傳遞方式與結(jié)果返回方式完全相同方式完全相同。 out和和inout兩種類型的參數(shù)允許

22、參數(shù)具有返回結(jié)果的能力,無兩種類型的參數(shù)允許參數(shù)具有返回結(jié)果的能力,無法直接映射到法直接映射到Java語言的參數(shù)傳遞機制,這時語言的參數(shù)傳遞機制,這時AccountHolder類為傳遞類為傳遞out和和inout參數(shù)提供了一個托架(參數(shù)提供了一個托架(holder)。)。山東大學計算機科學與技術(shù)學院In表明實際參數(shù)從客戶程序傳向?qū)ο髮崿F(xiàn)表明實際參數(shù)從客戶程序傳向?qū)ο髮崿F(xiàn)Out表明數(shù)據(jù)從實現(xiàn)對象傳遞給客戶程序,并且對象表明數(shù)據(jù)從實現(xiàn)對象傳遞給客戶程序,并且對象實現(xiàn)無需從客戶程序獲取參數(shù)的初始值實現(xiàn)無需從客戶程序獲取參數(shù)的初始值Inout表明數(shù)據(jù)從客戶程序傳給對象實現(xiàn),然后經(jīng)對表明數(shù)據(jù)從客戶程序傳

23、給對象實現(xiàn),然后經(jīng)對象實現(xiàn)加工后再返回給客戶程序象實現(xiàn)加工后再返回給客戶程序山東大學計算機科學與技術(shù)學院生成的對象傳遞支撐類生成的對象傳遞支撐類package Bank; public final class AccountHolder implements org.omg.CORBA.portable.Streamable public Bank.Account value; public AccountHolder() public AccountHolder(final Bank.Account _vis_value) this.value = _vis_value; public vo

24、id _read(final org.omg.CORBA.portable.InputStream input) value = Bank.AccountHelper.read(input); public void _write(final org.omg.CORBA.portable.OutputStream output) Bank.AccountHelper.write(output, value); public org.omg.CORBA.TypeCode _type() return Bank.AccountHelper.type(); AccountHolder.java山東大

25、學計算機科學與技術(shù)學院1.5.5 編寫對象實現(xiàn)編寫對象實現(xiàn)對象實現(xiàn)代碼所在的類名字可由程序員自由掌握,只要不與對象實現(xiàn)代碼所在的類名字可由程序員自由掌握,只要不與IDL編譯器自動產(chǎn)生的編譯器自動產(chǎn)生的Java類產(chǎn)生名字沖突即可。客戶程序類產(chǎn)生名字沖突即可??蛻舫绦蛞矡o須了解對象實現(xiàn)是由哪一個也無須了解對象實現(xiàn)是由哪一個Java類完成的。類完成的。CORBA應用程序的對象實現(xiàn)最常用、最簡單的實現(xiàn)方式是應用程序的對象實現(xiàn)最常用、最簡單的實現(xiàn)方式是使用繼承,即直接繼承由使用繼承,即直接繼承由IDL編譯器生成的編譯器生成的xxxPOA類。類。 當對象實現(xiàn)需要利用繼承機制達到其他目的時,就必須改用當對象

26、實現(xiàn)需要利用繼承機制達到其他目的時,就必須改用CORBA對象實現(xiàn)的另一種實現(xiàn)方式對象實現(xiàn)的另一種實現(xiàn)方式 紐帶機制(紐帶機制(tie mechanism)。)。我們的例子程序采用簡單的繼承方式編寫對象實現(xiàn)。我們的例子程序采用簡單的繼承方式編寫對象實現(xiàn)。山東大學計算機科學與技術(shù)學院賬戶的對象實現(xiàn)賬戶的對象實現(xiàn)public class AccountImpl extends Bank.AccountPOA / 屬性定義 protected float balance; / 構(gòu)造方法,按指定余額創(chuàng)建新的帳戶 public AccountImpl(float bal) balance = bal; /

27、 往帳戶中存款 public void deposit(float amount) balance += amount; / 從帳戶中取款,不足余額則返回false public boolean withdraw(float amount) if (balance 0 ? args0 : David Zeng; / 請求帳戶管理員找出一個指定名字的帳戶,無此帳戶則新開一個請求帳戶管理員找出一個指定名字的帳戶,無此帳戶則新開一個 Bank.Account account = manager.open(name); System.out.println(name + “的帳戶余額為的帳戶余額為” + accoun

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論