1 POA簡介
(1)POA結構
每一個POA都要維護一個活動對象映射(Active Object Map),它包含一個個對應于服務的對象ID,活動對象映射是一張将激活對象映射到相應服務的表。對象ID是一個由POA和使用者提供的實作使用的一個值,用來辨別一個特定的抽象的CORBA對象。對象ID的值可能由POA或實作來指派和管理,對象ID的值由引用封裝并對客戶方隐藏。對象ID沒有标準格式,它們被POA作為未解釋的8位位元組序列來管理。在POA中還需要根據實際應用實作諸如預設服務、服務激活器、擴充卡激活器、服務定位器之類的功能。
(2)POA工作機制
以對象引用為基礎,一個POA必須決定它是否能服務于那個對象。ORB通過一種定位機制去選擇一個合适的POA。一旦一個對象被定位,ORB 就會異步地将請求傳輸給POA。一旦對請求的處理結束,POA就會通知ORB并将結果傳回。在多個POA組成的樹形結構中,客戶發出的所有請求由根POA 接收,根POA在這之前已經在ORB上進行了注冊。請求是從根POA開始向下傳遞給它的下級的,如果專門處理某個請求的POA不存在,這個請求将發送給該 POA的父POA,并調用它的擴充卡激活器重建立立這個丢失了的POA。POA接收到了請求,然後通過對象的定位,使用對象的實作去處理接收到的請求。
2 CORBA實作IDL的伺服器端映射方式
CORBA支援兩種實作IDL接口的伺服器端映射:ImplBase inheritance(繼承)和Tie delegation(委托)。ImplBase方法用一個實作類實作IDL接口,其中的實作類也擴充編譯器生成的xxxImplBaseClass。 Tie方法用兩種類實作IDL接口:一個IDL生成的Tie類,該類繼承自xxxImplBaseClass,但委托所有的調用到一個實作類;一個實作 IDL生成的xxxOperations接口的類,它定義了IDL的功能。
3 POA-Tie的伺服器端實作
3.1 定義接口(Hello.idl)
首先使用IDL建立一個CORBA應用,規定所有的對象和接口。程式Hello.idl定義了一個CORBA對象,其中sayHello()操作傳回一個string,shutdown()方法用來關閉ORB。
module HelloApp
{
interface Hello
{
string sayHello();
oneway void shutdown();
};
};
3.2 伺服器端實作(HelloServer.java)
伺服器端包括兩個類:servant和server。Servant(HelloImpl)實作Hello的IDL 接口,Hello中的每一個執行個體都由HelloImpl中的一個執行個體實作。Servant是由Hello.idl通過idlj編譯器編譯産生的,是 HelloPOA的子類,它包含了Hello.idl中定義的兩個方法sayHello()和shutdown(),其餘的代碼是用來處理由 skeleton提供的ORB的,這個ORB用來對參數和結果進行編組等。
HelloServer類包含main()方法,它完成以下操作:
·建立并初始化一個ORB執行個體
·得到根POA的引用并激活POAManager
·建立servant執行個體并且通知ORB
·建立一個連接配接使servant成為代理
·為連接配接得到一個CORBA對象應用
·得到根的命名上下文
·用名字“Hello”在命名上下文中注冊一個新的對象
·等待用戶端對這個新對象的請求
HelloServer.java 中建立tie的核心代碼:
// create a tie, with servant being the delegate.
HelloPOATie tie = new HelloPOATie(helloImpl, rootpoa);
Hello href = tie._this(orb);
3.3 用戶端實作(HelloClient.java)
用戶端完成以下操作:
·建立并初始化ORB
·獲得根命名上下文
·在命名上下文中查找“Hello”并接收CORBA對象的引用
·調用對象的sayHello()和shutdown()方法,将結果列印出來
3.4 建立并運作Hello World
(1)使目錄中包含檔案Hello.idl
(2)運作idlj,産生stub和skeleton
(3)編譯*.java 檔案: javac*.javaHello
App/*.java
(4)啟動orbd:start orbd -ORBInitialPort 1050 -ORBInitialHost localhost
(5)啟動Hello server: start java HelloSer
ver -ORBInitialPort 1050 -ORBInitialHost localhost
(6)執行用戶端應用程式:java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost
綜上所述,POA-Tie機制利用了java的多接口繼承,使用POA-Tie機制可以更靈活地在java中實作CORBA,并能提供附加的、像架構一樣的函數提供給伺服器端對象。