CORBA服務
(本文轉載自軟件工程專家網 www.21cmm.com )
蘇洋
CORBA服務的基本內容
在CORBA體系規范中定義了多種類型的服務(Service),如命名(Naming)、生存期(LifeCycle)、事件(Event)、事務(Transaction)、對象持久化(Persistent Objects)、查詢(Query)、特征(Property)、時間(Time)等服務功能。CORBA服務與對象請求代理之間的關系如下圖所示。
在CORBA規范中,沒有明確說明不同廠商的中間件產品要實現所有的服務功能,并且允許廠商開發自己的服務類型。因此, 不同廠商的ORB產品對CORBA服務的支持能力不同,使我們在針對待開發系統的功能進行中間件產品選擇時,有更多的選擇余地。
下面介紹與分布式應用程序設計和開發關系密切的CORBA服務內容:
1. 對象命名服務(Naming Service)
在命名服務中,通過將服務對象賦予一個在當前網絡空間中的惟一標識來確定服務對象的實現。在客戶端,通過指定服務對象的名字,利用綁定(Bind)方式,實現對服務對象實現的查找和定位,進而可以調用服務對象實現中的方法。
2. 對象安全性(Security)服務
在分布式系統中,服務對象的安全性和客戶端應用的安全性一直是一個比較敏感的問題,安全性要求影響著分布式應用計算的每個方面。對于分布在互聯網中的分布式應用來講,為了防止惡意用戶或未經授權的方法調用對象的服務功能,CORBA提供了嚴格的安全策略,并制定了相應的對象安全服務。安全服務可以實現如下功能:
● 服務請求對象的識別與認證;
● 授權和訪問控制;
● 安全監聽;
● 通信安全的保證;
● 安全信息的管理;
● 行為確認。
CORBA系統將對象請求的安全性管理的功能交由ORB負責,系統組件只需負責系統本身的安全管理,使得基于分布式應用在安全性控制方面的責任十分明確。
3. 并發控制(Cocurrency Control)服務
CORBA規范中定義并發控制服務的目的在于實現多客戶訪問情況下的并發性控制和對共享資源的管理。
并發控制服務由多個接口構成,能夠支持訪問方法的事務模型和非事務模型。由于兩種模型的引入,使得非事務型客戶在訪問共享資源時,如果該資源被擁有事務模型的方法鎖定(Lock),則該客戶轉入阻塞狀態,直到事務型方法執行結束,將共享資源鎖打開,非事務模型的客戶才能夠訪問該共享資源。
并發控制服務使多個對象能夠利用資源鎖定(Lock)的方式來對共享資源進行訪問。在訪問共享資源之前,客戶對象必須從并發控制服務中獲得鎖定。在確認資源目前正在空閑時,獲得資源的使用權。每個鎖定是一個資源-客戶對,說明哪個客戶正在訪問何種類型的資源。
4. 對象生命期服務(LifeCycle)
CORBA中的生命期服務定義和描述了創建、刪除、拷貝和移動對象的方法。通過生命期服務,客戶端應用可以實現對遠程對象的控制。
利用命名(Naming)服務
實現分布式應用
在 上篇文章 中介紹的利用JavaIDL開發分布式應用時曾采用命名服務的方式。對象命名服務是ORB查找服務對象實現的一種簡單的方式。
1. 功能需求分析和定義接口文件
本例的主要功能是模擬電話用戶注冊及電話號碼查詢業務,開發基于命名服務的分布式應用程序,中間件產品采用VisiBroker 4.5.1 for Java。
根據系統功能的定義,兩種業務均屬于電信業務的經營范圍,因此定義模塊名TeleCom。電話號碼注冊為電信業務管理功能范圍,需定義該功能接口Registry,該接口內包含用戶注冊方法register();電話號碼查詢為用戶服務功能范圍,需定義接口User,該接口內包含查詢個人電話號碼方法getNumber()。經過上述分析后編寫的IDL接口定義文件TeleCom.idl如下:
module TeleCom
{ interface User //接口User聲明
{ //接口中getNumber方法的定義
int getNumber();
};
interface Registry //接口Registry聲明
{ //接口中register方法定義,其中以string類型變量作為輸入參數 ’方法返回User對象
User register(in string name);
};
};
上述接口定義文件經idl2java編譯后,在當前接口文件目錄中生成TeleCom子目錄,該目錄中包括UserPOA.java、RegistryPOA.java等文件。這些文件是客戶端和服務對象實現功能的框架以及相關的支持文件。有興趣的讀者可以實際創建IDL文件,經IDL到Java語言的映射后,分析生成文件的格式。
2. 實現服務功能
(1)實現User接口的類UserImpl
根據系統分析確定的功能,定義接口User對應的實現類UserImpl的代碼如下:
// UserImpl類繼承定義在UserPOA.java中的UserPOA類
public class UserImpl extends TeleCom
.UserPOA
{ private int aNumber;
//構造方法
public UserImpl( int number )
{ aNumber = number;
}
//接口中定義的方法,用于返回該用戶對象對應的電話號碼
public int getNumber( )
{ return aNumber;
}
}
(2)實現Registry接口的類RegistryImpl
根據系統分析確定的功能,定義接口Registry對應的實現類RegistryImpl的代碼如下:
// RegistryImpl類繼承定義在RegistryPOA
.java中的RegistryPOA類
public class RegistryImpl extends TeleCom
.RegistryPOA
{ public synchronized TeleCom.User register( String name )
{ //根據用戶名name生成注冊的電話號碼
//根據指定的電話號碼,生成User接口的實現類UserImpl
//激活可移植對象適配器
//將注冊的用戶對象存入對象庫
}
//返回用戶對象的實例
}
3. 實現服務器端應用
根據功能描述及采用的ORB命名對象服務策略,按如下方式實現服務器端應用程序:
首先對ORB進行初始化,并獲取根POA(RootPOA)的引用。通過在根POA中解析命名服務獲得命名服務上下文,并根據服務對象的功能要求以相應的策略創建用戶POA,利用用戶POA完成服務對象端ORB與服務對象實現的通信。
服務對象的代碼框架為:
public class Server
{ public static void main(String[] args)
{ //初始化對象請求代理
org.omg.CORBA.ORB orb = org.omg
.CORBA.ORB.init(args,null);
//獲取根POA的引用
POA rootPOA =POAHelper.narrow(orb.resolve_initial_references(“RootPOA”));
//引用命名服務,獲取上下文內容
org.omg.CORBA.Object rootObj =
orb.resolve_initial_references(“NameService”);
NamingContextExt root =
NamingContextExtHelper.narrow(rootObj);
//創建POA服務策略
org.omg.CORBA.Policy[] policies =
{ rootPOA.create_lifespan_policy(LifespanPolicyValue.persistent) };
//根據服務策略創建用戶可移植對象適配器
POA myPOA = rootPOA.create_POA(“TeleCom_POA”,rootPOA.the_POAManager(),policies );
//生成服務對象
//申請服務對象標識
//激活服務對象
//激活可移植對象管理器
rootPOA.the_POAManager().activate();
//啟動ORB
orb.run();
}
}
4. 實現客戶端應用
根據服務對象端提供的命名服務類型,生成相應的對象請求代理,并利用命名服務的方式定位服務對象,提出服務請求。
public class Client
{ public static void main(String[] args)
{ //初始化對象請求代理
org.omg.CORBA.ORB orb = org.omg
.CORBA.ORB.init(args,null);
//引用命名服務,獲取上下文內容
org.omg.CORBA.Object rootObj = orb.resolve_initial_references(“NameService”);
NamingContextExt root = Naming-
ContextExtHelper.narrow(rootObj);
//利用命名服務定位服務對象
//其中服務對象名已經在Server.java中定義
org.omg.CORBA.Object mgrObj = ((NamingContext)root).resolve(root.to_name(“TeleComManager”));
TeleCom.Registry manager = TeleCom
.Registry.narrow(mgrObj);
//取得賬戶名name
//根據具體賬戶名申請用戶賬戶
TeleCom.Registry user = manager.open(name);
//獲取用戶分配的電話號碼
int number = user.getNumber();
//打印賬戶信息等操作
}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2316
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
