天天看點

POA簡介

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,并能提供附加的、像架構一樣的函數提供給伺服器端對象。