BCB情况下CORBA实做之处事器
副标题#e#
BCB带有多个领导(Wizards)以简化CORBA处事器的开拓进程。以下几步描写了如何用BCB成立一个CORBA处事器。
界说工具界面
利用CORBA server wizard成立一个包括起始时初始化BOA和ORBCORBA代码的处事器应用措施
编译包括界面界说的IDL文件,获得框架及存根。
用CORBA object wizard界说(并实现)类的实现。
完成4成立的类实现CORBA 工具
须要时,修改CORBA界面并将修改加进类实现中。
别的,可以选择将IDL文件注册插手界面库和工具激活守护历程。
——————————————————————————–
1-1 界说工具界面
拜见OVERVIEW同主题部门。
——————————————————————————–
1-2 利用CORBA server wizard成立一个包括起始时初始化BOA和ORBCORBA代码的处事器应用措施
要开始一个新的CORBA处事器工程,选择File|New,再从对话框的Multitier页选取题为CORBA Server的图标。CORBA Server wizard让你指定是生成节制台措施(console application)照旧窗口应用措施(windows application)。
假如成立一个节制台应用措施,可以说明是否利用VCL类。假如不选,那么所有生成的代码可以移植到其它平台上。
别的,选择应用措施范例时,还可以将任何已经存在的IDL文件加进工程中,或指定你想加进一个空缺的IDL文件。处事器工程最后必需一个或多个IDL文件,该文件界说客户用以与处事器通信的界面。
留意:假如在开始CORBA工程时没有插手IDL文件,你始终可以选择Project|Add to Project(对已经存在的IDL文件)或从New Items对话框的Multitier页选择CORBA IDL file(以界说新IDL文件)来插手。
当你选定处事器范例,单击OK,CORBA Server wizard将新建一个指定范例的处事器工程,将CORBA库插手工程文件,插手初始化ORB(工具请求署理)和BOA(根基工具配适器)的起始代码。
自动生成的代码界说两个变量:orb和boa,你可以用它们与ORB和BOA通信。
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
CORBA::BOA_var boa = orb->BOA_init(argc, argv);
假如指定为节制台应用措施,还会看到下面这行:
boa->impl_is_ready();
这个挪用使你的措施可以从BOA吸收动静,正如Windows动静轮回答允一个窗口应用措施从Windows收到动静。(而窗口型应用措施利用Windows动静轮回处理惩罚CORBA动静)。
ORB和BOA的细节见VisiBroker文档(可到inprise网站去下载)。
——————————————————————————–
#p#副标题#e#
1-3 编译包括界面界说的IDL文件,获得框架及存根。
一旦你将描写CORBA界面的IDL文件插手到CORBA工程中,你就已经筹备好生成存根和框架类了,这两个类将打点处事器与客户应用措施的通信。
生成存根和框架类,很简朴,编译一下IDL文件就获得了。当IDL文件显示在代码编辑器和工程打点器中时选择Project|Compile Unit,或在project manager的IDL文件上单击鼠标右键并选Compile就可以了。IDL编译器生成两个文件,它们会呈此刻工程打点器和代码编辑器中:
处事器文件(xxx_s.cpp)。这个文件包括框架类的实现。
客户端文件(xxx_c.cpp)。这个文件包括存根类的实现。
工程Option对话框的CORBA页答允你影响从IDL文件生成stub和skeleton的方法。譬喻,你可以指定只想在工程中包括处事器单位,或指定要包括Tie类(用于当处事器利用署理模式delegation model时)。这些选项影响当前工程中所有的IDL文件。
注: delegation model,当利用已经写好的从不答允多实例VCL类衍生的CORBA处事器或想与其它非CORBA应用措施共享时,可以利用不其于CORBA或不生成处事器文件的处事器类。输出不是从框架类衍生的工具时,应用措施必需利用delegation model。它是这样的模式:框架类实例并不直接实现CORBA工具,而是将界面挪用传给完全疏散现实的类。即实现的类不是担任自skeleton而是被skeleton挪用。
要利用delegation model就要在编译IDL文件时生成tie类(绑定类)。这样编译获得的框架类多出一个非凡的tie类。它充当你实现的类及其要领的署理,它将用户挪用委派给你实现的类。
详情见联机辅佐。
——————————————————————————–
1-4 用CORBA object wizard界说(并实现)实现类。
//译者:这里大量利用“实现”一词,其意思根基上就是实际生成。
要实现界说在IDL文件中的CORBA工具,必需实现每个框架类。要完成它,选择File|New,从对话框的mutitier页中选择CORBA Object Implementation。这将触发CORBA Implementation Wizard。
#p#分页标题#e#
CORBA Object Implementation Wizard列出工程包括的IDL文件中界说的所有界面。选择一个IDL文件,再从这个文件中选择要实现的界面。提供一个实现类的名字并指定数名.h、.cpp文件的单位名。这些文件将包括工具的界说和实现。
在领导中说明实现的类是否应该担任自动生成的框架类,可能要利用delegation model(tie类)。假如利用署理模式(且处事器是VCL可用的),还应该汇报领导使你实现的类成为一个数据模块(data module)。这答允你向实现的数据模块中插手所需的构件(components)。
可以汇报领导插手代码以便应用措施启动时实例化你的CORBA工具,这样他们就有本领收到客户请求。假如你启动时实例化工具,必需给他们提供名字供客户定位用。当客户应用措施动态绑定到你的CORBA工具时,他们利用这个名字指明想要的工具。
当你点下OK时,CORBA Object Implementation Wizard生成你实现的类的界说并生成其实现,这个实现的每个要领体都是空的。假如你指定,它也可以插手实例化工具的代码。
在这些改变加进工程之前,还可以查察、编辑他们。要这样做的话,在点OK之前选上标题为Show Updates的复选框。在你查察修改之后,他们被加进工程。假如你领导竣事时没有选择查察和修改,你可以今后再在代码编辑器里编辑它们。
要实现多个界面,就要多次利用CORBA工具实现领导,每次一个界面。可是,你可以提供多个名字来让领导生成单个实现类的多个实例。
——————————————————————————–
1-5 完成4成立的类实现CORBA工具
假如你没有利用delegation model(署理模式),那么实现类是将从框架类衍生而来,框架类是编译IDL文件时生成的。不然就你的实现类就不会有明晰祖先。你可以改变这个类界说使它担任处事措施的其它类,但不要移去任何已有的对框架类的担任。
思量如下取自IDL文件account.IDL中的片段(该文件在BCB例子中):
interface Account {
float balance();
};
当IDL文件被编译时(不带tie类),生成的处事器头(account_s.hh)包罗了带有对应界面中每个要领的纯虚要领的框架界说。
CORBA Object Wizard建设一个实现单位,在该单位中从框架类(_sk_Account)衍生一个实现类。它的头文件看起来如下:
#ifndef Interface1ServerH
#define Interface1ServerH
#include "account_s.hh"
//---------------------------------------------------------------------------
class AccountImpl: public _sk_Account
{
protected:
public:
AccountImpl(const char *object_name=NULL);
CORBA::float balance();
};
#endif
你可以在这个类界说插手所需的附加数据成员或要领的界说。譬喻:
#ifndef Interface1ServerH
#define Interface1ServerH
#include "account_s.hh"
//---------------------------------------------------------------------------
class AccountImpl: public _sk_Account
{
protected:
CORBA::float _bal;
public:
void Initialize(CORBA::float startbal); // not available to clients
AccountImpl(const char *object_name=NULL);
CORBA::float balance();
};
#endif
这些附加的要领和属性来在处事器措施里有效,但没有导出给客户端。
在生成的.cpp文件中,填写实现类的主体,就获得了可以事情的CORBA工具:
AccountImpl::AccountImpl(const char *object_name):
_sk_Account(object_name)
{
}
CORBA::float AccountImpl::balance()
{
return _bal;
};
void Initialize(CORBA::float startbal) // not available to clients
{
_bal = startbal;
}
当实现CORBA工具的要领时,记着客户请求大概达到差异的线程。因此,你得防范线程斗嘴。
留意:在你的CORBA处事器中可以编写与BOA交互的代码。譬喻,利用BOA,可以姑且令处事器工具埋没或失活,过一回再从头激活他们。详见VisiBroker Programmer Guid。
缺省地,CORBA应用措施是多线程的。这意味着在实现CORBA工具时必需防范线程斗嘴。通过链接到orb_b.dll和orb_br.dll也可以建设单线程的CORBA处事器,但这样做时就失去了IDE对CORBA的支持或在处事器措施中利用VCL的长处。
除非你指定,不然BOA用缓冲池缓冲客户线程,就是说客户可以利用任何可用的线程。然而也可以确保每个线程始终利用沟通的线程,即用逐会话线程计策启动BOA。当所有客户利用同一线程时,可以在线程变量中生存耐久客户的信息。详见VisiBroker Programmer Guid。
#p#分页标题#e#
Visibroker库包括可以辅佐你制止线程斗嘴的类。它们在vthread.h中界说,安装在VisiBroker的include目次里。VisiBroker线程支持类包罗一个互斥锁(mutex)名为VisMutex,一个条件变量(VISCondistion)及读写锁定,读写锁定事情方法雷同于VCL的多重读取独有写同步装置(VISRWLock)。利用这些类的长处是他们可被移植到Visibroker支持的任意平台上。
譬喻,你可以在类实现插手VisMutex域以掩护实例数据:
class A{
VISMutex _mtx;
...
}
然后,当你需要同步实例数据存取时,可以在存取实例数据的任何要领中锁上互斥锁:
void A::AccessSharedMemory(...)
{
VISMutex_var lock(_mtx); //请一把锁,锁要已经被释放退出。
//其它代码,存取实例数据。
}
留意,互斥锁会在AccessShareMemory执行完毕后释放,纵然在要领体内抛出了意外。
假如你在处事器措施中利用VCL,BCB包罗很多类辅佐你防范线程斗嘴。见联机辅佐的Writing multi-threaded applications部门。
——————————————————————————–
1-6 须要时,修改CORBA界面并将修改加进类实现中。
假如在用CORBA Object Wizard生成实现类之后修改IDL文件中的界面,CBuilder让你可以自动更新处事器工程反应这些改变并担保已经写实现类代码不会丢失。
在你修改IDL文件之后,选择Edit|CORBA Refresh。这条呼吁重编译IDL文件以自动生成处事器和客户文件反应新的界面界说和当前的编译选项。假如IDL文件编译乐成,利用Project Updates对话框,你可以预览并编辑C++BUILDER将做的修改。
留意:假如CBuider找不到与现存实现类相应的界面,会问你是否改变了界面名字。假如答是,会提示你说明界面是怎么更名的,这样实现的类可以正确匹配界面。
当你利用CORBA Refresh呼吁时,新的要领被加进你的实现类中,申明被更新以反应对现有要领和属性的改变。然而,某些修改不会引起更新。出格是,假如你删除一个要领或属性,它的代码是不删除的。相反,被删除的要领保存在类中,但对CORBA客户不再可用了。相似的,假如你更名一个要领或属性,会被看成一个删除和一个增加,老的要领或属性将保存,并为新要领、属性生成代码。
——————————————————————————–
IDL文件注册
尽量注册不是必须的,但假如你只利用静态绑定客户挪用随处事器工具,发起注册界面。有两个事情可用来注册界面:
界面客栈(Interface Repository)。注册到界面客栈,客户可以在利用动态请求界面时(Dynamic Invocation Interface)编程获取界面信息。注册到界面库也便于其它开拓者在写客户应用时查察你的界面。
工具激活守护历程(Object Activation Daemon)。注册至OAD,便利可以直到客户需要之时,处事器才加载或工具才实例化。这样可节减处事器上的资源。