CORBA中的异步传输机制
2008-04-09 04:08:03来源:互联网 阅读 ()
本文主要讨论了的CORBA的异步传输机制ONEWAY以及事件服务。同时给出用DELPHIL利用ONEWAY以及事件服务异步传输机制实现的简单模型。
我们通常讨论的CORBA模型往往从客户机激发远程方法的角度来讨论C O R B
A系统。象通常的客户机和服务器模型:客户机和服务器组件分别运行在不同的机器上,客户机发出一个请求,然后客户机阻塞。服务器主动监听从客户机来的请求。当收到一个请求后,服务器处理这个请求,并把结果返回给发出请求的客户机。客户机在等待回应时是阻塞的,只有在它接收到回答后才能继续处理。
在很多场合中,这种模型正好是用户所希望的。而且这种模型也符合传统的C/S模型,有问有答。但是在很多场合中并不需要这种模型,象股票系统中,普通股民眼中的价格更新,SCADA电力系统中的现场数据的显示等,都是不需要客户机发出请求,服务器就把结果返回给客户。还有在很多场合中,客户机发出一个请求后,并不希望得到服务器的回答,它需要的只是给服务器一个通知,象SCADA电力系统中的前置机往服务器上发数据,前置机并不需要等待这个服务器上的回答返回。为解决上述问题,CORBA提出了ONEWAY以及事件服务异步传输机制。
ONEWAY异步传输,顾名思义,ONEWAY就是"单向",即客户机发出它们的激发,然后继续处理,而用不着在发出一请求后阻塞,直到结果返回,当服务器完成对该请求的处理后,它可以通过向客户机发回一相应的单向激发把结?quot;返回",也可以不返回结果。
利用ONEWAY异步传输比较简单,它的一般步骤与普通CORBA应用一样:
1.
首先定义接口的IDL文件。
2. 编译IDL文件。
3. 编写服务器端程序。
4. 编写客户端程序。
这里我以DELPHI6(在DELPHI6中CORBA规范是由VisiBroker产品来实现的)为开发工具,来实现ONEWAY异步传输:
1. 首先定义接口的IDL文件:为了简单,我这里只定义了一个ONEWAY的方法。
module Pro
{
interface IOnewDemo;
interface
IOnewDemo
{
oneway void onewaya(in long aa);
};
interface
OnewDemoFactory
{
IOnewDemo CreateInstance(in string
InstanceName);
};
};
2.和3在DELPHI6中,第二步和第三步是和在一起的。
选FILE-NEW-OTHER-CORBA-CORBA Server Application 在出现的IDL2Pas
Create Server
Dialog中按Add按钮加入刚才定义的IDL文件,按OK按钮以后,由IDL2Pas编译器来对它进行编译,生成Pro_c.pas,Pro-i.Pas,Pro_Impl.pas,Pro_s.pas四个文件,在Pro_Impl.pas文件中定义
procedure TIOnewDemo.onewaya ( const aa :
Integer);
begin
form1.ListBox1.Items.Clear;
form1.ListBox1.Items.Add(inttostr(aa));
end;
在程序启动时进行初始化
procedure TForm1.FormCreate(Sender:
TObject);
var
Acct:
IOnewDemo;
begin
CorbaInitialize;
// Add CORBA server code here
like this
Acct := TIOnewDemoSkeleton.Create('ygl',
TIOnewDemo.Create);
BOA.ObjIsReady(Acct as _Object);
end;
编译生成服务器端程序。
4. 编写客户端程序:
在程序启动时进行初始化
procedure TForm1.FormCreate(Sender:
TObject);
var
Acct:
IOnewDemo;
begin
CorbaInitialize;
// Bind to the Corba server
like this
Acct := TIOnewDemoHelper.bind;
end;
调用接口定义方法
procedure TForm1.Timer1Timer(Sender:
TObject);//utilize the mothod of
interface
var
i:integer;
begin
randomize;
i:=random(20);
acct.onewaya(i);
end;
编译生成客户器端程序。
CORBA中的事件服务是基于以下的原因定义的:
事件发送者和事件接收者的关系是松偶合的:事件发送者发送消息时,并不关心谁会收到消息。事件接收者接收消息时,也并不关心谁发送的消息。这里事件发送者称为事件供应者,事件接收者称为事件消费者。
在VisiBroker的事件实现中,它定义了两种事件模型:PUSH模型和PULL模型:如果一个事件是由供应者主动发出,消费者被动接收,就称为PUSH模型,如果一个事件是由消费者主动索取,供应者被动提供,就称为PULL模型。
PUSH模型可以简单表示为:
DELPHI6中在COSEVENT单元中定义了通用的接口:
PushConsumer , PushSupplier, PullSupplier , PullConsumer,
ProxyPushConsumer
ProxyPullSupplier , ProxyPullConsumer , ProxyPushSupplier
, ConsumerAdmin , SupplierAdmin , EventChannel…..
这里我用PUSH模型简单说一下通讯建立的过程:
供应者端:
1.
供应者获得一个SupplierAdmin对象。供应者通过调用Event_Channel的for_suppliers得到一个SupplierAdmin对象。
2.
供应者获得一个ProxyPushConsumer对象。供应者通过调用SupplierAdmin的obtain_push_consumer得到一个ProxyPushConsumer对象。
3.
供应者利用ProxyPushConsumer对象的connect_push_supplier连接远方的ProxyPushSupplier对象。
消费者端:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:系统分析(二)
下一篇:软件构件技术在MIS开发中的应用
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash