Corba應用之TAO 實現庫ImR(Implementation Repository)的使用

Corba應用之TAO 實現庫ImR(Implementation Repository)的使用 作者: [email protected] 零、前言 這篇文章是在學習ACE_wrappers/TAO/docs/tutorials/Quoter/Simple/Impl-Repo/範例時碰到問題時纔想到寫的,按照範例的步驟是無法運行(Implementation Repository)樣例的,後來研究了相關了README文檔才找到了問題所在,於是爲了方便後來的同學者,並把相關的閱讀材料翻譯出來,整理成了下面的文章。由於自己的學識有限,也可能原文本身就有含糊之處,所以可能其中有翻譯不準或理解不精確之處,希望大家體諒,並指正出來。 一、本文術語約定: 實現庫:本身也是一個CORBA的服務(系統自帶) 服務:指要被 應用 調用的實體,本身也是一個CORBA服務(一段程序,非系統服務),註冊在實現庫中 應用:泛指客戶端的的應用程序,和客戶端同意,這個應用程序可能與服務在一臺機器上,也可能在不同的機器上,用來調用服務 二、實現庫的概述: 當某個應用調用某個服務時,相關的請求先發送到實現庫,如果該服務沒有啓動,則先啓動這個服務,然後把調用轉發到這個服務。當服務激活時,實現庫用來跟蹤某個服務,並且記錄下相關的信息,以便於下次重新激活這個服務。 三、實現庫的使用方法: 一個應用如果要去使用實現庫中的某個服務,這個服務必須通過ImR文件通信方式,以實現跟蹤和同步服務的最新運行狀態。這個功能已經包含在POA中,所以一個服務使用持久化POA,並且別指定-ORBUseImR參數,那麼它將能夠和實現庫保持通信。 ImR的特性用來提高tao系統的吞吐量和平衡度,它使的實現庫可以把任務分解成ImplRepo_Service 和ImR_Activator兩層來實現。 1.ImplRepo_Service ImplRepo_Service“實現庫”實現的主要程序,它對使用ImR的應用是可見的,它接受一個來自於tao_ImR的請求,然後把這個請求分派到註冊過的ImR_Activator上。ImplRepo_Service是無狀態的,除了註冊在其上的ImR_Activato信息,其他信息都不維護。它的任務是作爲一個應用和實際執行請求的ImR_Activator中間媒介。 到目前爲止,任何時刻只能有一個ImplRepo_Service可以運行,通過常用的方法,如-ORBInitRef、-ORBDefaultInitRef 或者廣播(multicast)的方式都可以調用到ImplRepo_Service。 ImplRepo_Service程序運行的參數: -d 調試信息的開關,缺省是打開,0 是關閉 -m 支持廣播發現 -o 如果想生成ior文件,該參數後跟一個文件名 當然,還有其他與ORB相關的參數。可以加參數-h查看具體的命令格式,下文也有示例。 2.ImR_Activator ImR_Activator是真正執行的實體,它可以激活服務、關閉服務,也可以維護與它相關的各個服務程序的信息。一臺主機上只能運行一個ImR_Activator實例,ImR_Activator對應用是透明的,只有ImplRepo_Service可以直接和它接觸,也只有ImplRepo_Service才需要它。 一個ImR_Activato實例首先要使用ImplRepo_Service進行註冊,這樣纔可以接受請求。當進行註冊時,它傳遞當前的主機名和它自己的IOR文件給ImplRepo_Service。在以後ImplRepo_Service訪問它時,會使用到這些同樣的信息。 ImR_Activator程序運行的參數: -c 運行的服務命令 -d 打印調試信息 -l 鎖住數據庫 -o 生成 IOR文件,用於可能其他的需要此信息 -r 允許WIN32註冊實現 -t 設一個延時時間 -h 打印幫助信息 當一個持久化的ImR_Activator被請求時,可能需要保存一些信息,如啓動參數、定位信息、工作目錄動。這些信息可以設置參數保存在一個文件裏,保存的格式如下: -p 傳遞一個ImplRepo_Service文件名,用ACE_Configuration_Heap方式存儲 -x 存儲在一個XML格式的文件 裏 存儲的這些信息可以在與具體服務相關的tao_imr裏作爲參數傳遞。 3.工作過程 1)運行一個ImplRepo_Service。 只有ImplRepo_Service running運行,才能實例化應用需要的一個或多個ImR_Activato。 2)選擇ImR_Activator 當一個服務需要新增到實現庫,或者一個已經存在的服務需要更新時,一個請求就通過tao_imr程序發送到ImplRepo_Service,如上所說,啓動的命令、工作目錄、服務的當前主機以及其他的信息都要通過tao_imr傳遞給ImplRepo_Service。ImplRepo_Service在傳遞過來的主機中選擇ImR_Activator來激活相應的服務,如果選擇不到相應的ImR_Activator,則通過一定的算法來選擇。一旦一個ImR_Activator被選擇,它還需要對激活的服務的生命週期負責。 3)執行服務 當ImR_Activator被選中後,ImplRepo_Service傳遞相關的請求給ImR_Activator,這個ImR_Activator調用服務執行相關的請求,並且更新它的數據庫以反應服務的最新狀態。 4.ImR的運行及使用 結合TAO 1.4 關於Implementation Repository文檔(見ACE_wrappers/TAO/docs/tutorials/Quoter/Simple/Impl-Repo/index.html)來說明,本人在linux9.0 環境下根據該文檔提供的步驟無法進行服務的註冊(返回Could not register server . Activator <> not found!),主要是因爲缺少了中間ImR_Activator的過程,所以該樣例無法正常運行。下列過程在Server的當前目錄下運行。 1) 首先運行ImplRepo_Service $TAO_ROOT/orbsvcs/ImplRepo_Service/ImplRepo_Service -o implrepo.ior -d 0 -ORBobjrefstyle URL & 2)然後運行ImR_Activator $TAO_ROOT/orbsvcs/ImplRepo_Service/ImR_Activator -ORBInitRef ImplRepoService=file://implrepo.ior & 3)$TAO_ROOT/orbsvcs/ImplRepo_Service/tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior add childPOA -c "./server -ORBUseIMR 1 -ORBobjrefstyle URL -ORBInitRef ImplRepoService=file://implrepo.ior" 系統返回: Imr Activator: Register server childPOA. Successfully registered server 這表明服務已經註冊成功 4)啓動服務用來生成IOR文件,並且寫入stock_factory.ior文件 $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior ior childPOA -f stock_factory.ior 5)應用啓動時將把stock_factory.ior文件作爲參數傳遞出去,並且自動進入到實現庫ImR服務中,如果服務沒有啓動,則實現庫ImR啓動服務。 如果一個服務當前不再被應用所使用,則可以通過如下命令關閉: $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior shutdown childPOA 如果一個服務任何時候都不再被使用,則可以從ImR數據庫中去除它: $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior remove childPOA 6)客戶端應用 ./client file://stock_factory.ior MSFT RHAT 返回: The price of a stock in "Microsoft, Inc." is $91 The price of a stock in "RedHat, Inc." is $210 測試一下持久化POA的運行情況,把當前服務停掉: $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior shutdown childPOA 則再執行./client file://stock_factory.ior MSFT RHAT 返回: The price of a stock in "Microsoft, Inc." is $91 The price of a stock in "RedHat, Inc." is $210 結果情況說明,雖然服務被停掉,但是客戶端應用可以通過ImR機制完成服務的調用。 四、在實現庫ImR機制中,服務Server實現需要做哪些工作 1.在以前的版本中,實現庫需要顯式的使用IR_Help類,現在只需要使用-ORBUseImR 1參數說明即可。 2.Server實現需要一些限制,在Server中,只有持久化的POA才能被ImR支持,並且Server中的POA名稱作爲ImR的key作爲入口索引,換句話說,一個Server只能有一個唯一的持久化的POA。 五、ImR -ORBDefaultInitRef參數的使用 1.一個基本的(或缺省的)IOR被作爲默認參數被ORB傳遞。當resolve_initial_reference方法被調用時,這個ORB會把sevice名稱附加在基本的IOR裏,形成一個完成的IOR。使用這樣的ImR時,會有一個非常有用的特徵,就是當ImR's endpoint被作爲基本的IOR使用時,那麼這個ImR可以通過resolve_initial_reference方法的調用提供許多服務。比如,如果一個ImR service運行在一個主機爲doriath端口爲5555上,那麼可以認爲名字服務也已經註冊在這個ImR service上了。 應用可以通過缺省參數-ORBDefaultInitRef使用名字服務: client -ORBDefaultInitRef corbaloc:iiop: doriath:5555 當應用調用resolve_initial_reference(“Nameservice”),ORB將解析成“corbaloc:iiop:doriath:5555/NameService”,此時ImR就可以識別這個IOR並作爲一個指針定位到實際的NameService,然後在需要的情況下啓動這個NameService服務,最後,應用連接到該名字服務上。 2.以缺省參數的方式使用一個服務必須滿足兩個條件 1)這個服務必須註冊成resolve_initial_reference調用的名字。比如,Name服務必須註冊成“NameService”,並且也包含一個POA,這個POA的名字也要是“NameService” 2)這個服務必須能夠處理這個名字"corbaloc:iiop:machine:port/poa_name" 六、服務Server被激活的模式 1) NORMAL 缺省的方式。應用發出請求,然後自動通過tao_imr 方式激活 2) MANUAL 手動方式。通過手動tao_imr命令行方式激活 3) PER_CLIENT 每個應用請求會激活一個新的服務進程啓動。 因爲每個客戶端緩存前面的引用,所以一個客戶端對應一個服務。這也會有一些異常,比如最原始的IOR被用於不同的線程(每個線程獲得不同的服務)。因爲在這種模式下實現庫並不保存每個啓動的服務的信息,所以它也就不能關閉服務,由此這個服務必須有一個可以被關閉的的方式。 4) AUTO_START 當實現庫啓動時,服務自動啓動。tao_imr也有一個自動啓動的命令,可以自動啓動標記爲自動方式的所有服務。 七、未來實現庫的發展: 未來實現庫使用ORT(Object Reference Template)技術,這個技術使的實現庫可以省去ImR_Activator的中間過程,只需要IO指向ImplRepo_Service即可。
發佈了14 篇原創文章 · 獲贊 2 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章