CORBA中的异步传输机制

2008-04-09 04:08:03来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  本文主要讨论了的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开发中的应用