天天看点

POA简介

1 POA简介

  (1)POA结构

  每一个POA都要维护一个活动对象映射(Active Object Map),它包含一个个对应于服务的对象ID,活动对象映射是一张将激活对象映射到相应服务的表。对象ID是一个由POA和用户提供的实现使用的一个值,用来标识一个特定的抽象的CORBA对象。对象ID的值可能由POA或实现来赋值和管理,对象ID的值由引用封装并对客户方隐藏。对象ID没有标准格式,它们被POA作为未解释的8位字节序列来管理。在POA中还需要根据实际应用实现诸如缺省服务、服务激活器、适配器激活器、服务定位器之类的功能。

  (2)POA工作机制

  以对象引用为基础,一个POA必须决定它是否能服务于那个对象。ORB通过一种定位机制去选择一个合适的POA。一旦一个对象被定位,ORB 就会异步地将请求传输给POA。一旦对请求的处理结束,POA就会通知ORB并将结果返回。在多个POA组成的树形结构中,客户发出的所有请求由根POA 接收,根POA在这之前已经在ORB上进行了注册。请求是从根POA开始向下传递给它的下级的,如果专门处理某个请求的POA不存在,这个请求将发送给该 POA的父POA,并调用它的适配器激活器重新建立这个丢失了的POA。POA接收到了请求,然后通过对象的定位,使用对象的实现去处理接收到的请求。

  

  2 CORBA实现IDL的服务器端映射方式

  CORBA支持两种实现IDL接口的服务器端映射:ImplBase inheritance(继承)和Tie delegation(委托)。ImplBase方法用一个实现类实现IDL接口,其中的实现类也扩展编译器生成的xxxImplBaseClass。 Tie方法用两种类实现IDL接口:一个IDL生成的Tie类,该类继承自xxxImplBaseClass,但委托所有的调用到一个实现类;一个实现 IDL生成的xxxOperations接口的类,它定义了IDL的功能。

  

  3 POA-Tie的服务器端实现

  3.1 定义接口(Hello.idl)

  首先使用IDL创建一个CORBA应用,规定所有的对象和接口。程序Hello.idl定义了一个CORBA对象,其中sayHello()操作返回一个string,shutdown()方法用来关闭ORB。

  module HelloApp

  {

  interface Hello

  {

  string sayHello();

  oneway void shutdown();

  };

  };

  3.2 服务器端实现(HelloServer.java)

  服务器端包括两个类:servant和server。Servant(HelloImpl)实现Hello的IDL 接口,Hello中的每一个实例都由HelloImpl中的一个实例实现。Servant是由Hello.idl通过idlj编译器编译产生的,是 HelloPOA的子类,它包含了Hello.idl中定义的两个方法sayHello()和shutdown(),其余的代码是用来处理由 skeleton提供的ORB的,这个ORB用来对参数和结果进行编组等。

  HelloServer类包含main()方法,它完成以下操作:

  ·创建并初始化一个ORB实例

  ·得到根POA的引用并激活POAManager

  ·创建servant实例并且通知ORB

  ·创建一个连接使servant成为代理

  ·为连接得到一个CORBA对象应用

  ·得到根的命名上下文

  ·用名字“Hello”在命名上下文中注册一个新的对象

  ·等待客户端对这个新对象的请求

  HelloServer.java 中创建tie的核心代码:

  // create a tie, with servant being the delegate.

  HelloPOATie tie = new HelloPOATie(helloImpl, rootpoa);

  Hello href = tie._this(orb);

  3.3 客户端实现(HelloClient.java)

  客户端完成以下操作:

  ·创建并初始化ORB

  ·获得根命名上下文

  ·在命名上下文中查找“Hello”并接收CORBA对象的引用

  ·调用对象的sayHello()和shutdown()方法,将结果打印出来

  3.4 创建并运行Hello World

  (1)使目录中包含文件Hello.idl

  (2)运行idlj,产生stub和skeleton

  (3)编译*.java 文件: javac*.javaHello

  App/*.java

  (4)启动orbd:start orbd -ORBInitialPort 1050 -ORBInitialHost localhost

  (5)启动Hello server: start java HelloSer

  ver -ORBInitialPort 1050 -ORBInitialHost localhost

  (6)执行客户端应用程序:java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost

  综上所述,POA-Tie机制利用了java的多接口继承,使用POA-Tie机制可以更灵活地在java中实现CORBA,并能提供附加的、像框架一样的函数提供给服务器端对象。