orbas各个模块之间的关系与接口说明



Last Modified : 2002.12.19

(by huihoo.com orbas项目组)

orbas的初步计划主要涉及的模块有ORB、GIOP、IOR、typecode、Pluggable protocols framework和CDR,当然还有POA部分。其他的模块还只在计划之中。

其中typecode部分不是minimumCORBA的内容,但是orbas也作了保留,以便于orbas引入一些标准CORBA的能力。

ORB与IOP引擎之间的接口: Worker对象、ClientWorker对象和ServerWorker对象共同构成的ORB对象与IOP消息引擎之间的接口。这是一组协议无关的接口,不同的协议,只要实现了这组接口,就可以插入不同的inter-ORB协议。GIOP协议是其中的实现之一。如果用户相定制自己的IOP,可以自己实现这组接口,并配置相应的配置文件即可。

Worker类


Worker对象有3个成员

public abstract Transport getTransport(),返回当前进行所有网络访问的缺省Transport对象。这是一个虚函数,有具体的协议实现。它也是IOP引擎与底层传输协议之间的接口之一。

public abstract CDRInputStream read():从网络中读取一条消息,并构造org.huihoo.orbas.cdr.CDRInputStream对象返回。

abstract void write(org.omg.CORBA.portable.OutputStream out):将参数所表示的流输出到网络中。

ClientWorker接口: ClientWorker接口完成一个IOP客户端的功能,它的功能包括创建各种IOP消息的CDR编码流、以及引发远程对象的操作(invoke和invokeOneway操作)。

ServerWorker接口


ServerWorker接口实现了IOP服务器端的功能,它实现了java.lang.Runnable接口。

GIOP

GIOP模块是ORB与IOP引擎接口组的一个具体的实现。

GiopWorker类

GiopWorker类是.org.huihoo.orbas.orb.Worker类的子类,它仍然是一个抽象类。它实现了Worker的read和write操作。

GiopClientWorker类



GiopClientWorker类继承了GiopWorker抽象类并实现了org.huihoo.orbas.orb.ClientWorker接口。它还实现了org.huihoo.orbas.orb.Worker类 的getTransport()方法。它是IOP协议引擎的客户端的实现。

GiopServerWorker类


GiopServerWorker类继承了GiopWorker抽象类并实现了org.huihoo.orbas.orb. ServerWorker接口。它还实现了org.huihoo.orbas.orb.Worker类 的getTransport()方法。它是IOP协议引擎服务端的实现。

从ORB的getDefaultClientWorker就可以取得缺省的IOP引擎的客户对象。ObjrefDelegate使用它来创建请求来与其它的CORBA server通讯。

pluggable protocols framework对象说明
Channel类


Channel类是一个抽象类,它代表了一条可能的网络连接(或半连接,即具有连接能力的客户端或等待连接的服务器端),它的主要方法和成员变量有:

Target:TargetAddress类型,即Channel的setup操作指定的服务器端点。

SetTargetAddress():设定Channel类的target成员。

Setup():它向指定的TargetAddress发起一个连接,并返回具有传送能力的Transport类型的对象。

Accept():在某端口监听从网络上的连接请求。这是一个阻塞的方法,它直到有了连接请求并成功的建立了一个连接之后才会返回。

public abstract void teardown():销毁该连接;

TargetAddress类


它标识一个目标端点。它也是一个抽象类。它的主要方法有:

equal():比较两个TargetAddress类型的对象是否指向的同一个服务器端点。

InitialChannel():向本对象代表的目标端点发起连接,并返回Transport类型的对象。

ProfileExtractor类


ProfileExtractor类似一个抽象类。它可以分析org.omg.IOP.TaggedProfile对象,并返回缩需要的值。与协议相关的具体操作需要继承并实现这个抽象类。

in:org.huihoo.orbas.orb.cdr.CDRInputStream,ProfileExtractor从这个输入流中读取数据并分析出其中的结构。

public void setInputStream(CDRInputStream in):设置输入流;

public abstract void parse():进行具体分析的动作;

public abstract TargetAddress getTargetAddress():当对Profile的分析完成以后,调用此操作可以返回该Profile标识的TargetAddress对象,协议相关的实现必须重载该方法;

public abstract byte[] getObjectKey():返回Profile中的objectkey;

ProfileCreator类


ProfileCreator是一个抽象类。他用于创建协议相关的org.omg.IOP.TaggedProfile对象。

成员:

CDROutputStream out:Profile的输出流,最后生成的Profile就放在out中;

public void setOutputStream(CDROutputStream out):为ProfileCreator设置输出流;

public abstract initialChannel():返回一个协议相关的Channel对象;使得ServerWorker对象能够开始监听网络的请求;

ProfileRegistry类


这是所有的ProfileCreator和ProfileExtractor的协议相关的实现对象的注册表,所有协议相关的ProfileCreator和ProfileExtractor对象都必须在ProfileRegistry对象中注册。ProfileRegistry对象可以根据协议的枚举值得不同返回相应的ProfileCreator和ProfileExtractor对象。

public void registerProfileDealer(int tag, ProfileCreator creator, ProfileExtractor extractor):注册

协议相关的ProfileCreator和ProfileExtractor对象,tag表明了他们能处理的协议类型;

public ProfileExtractor getProfileExtractor(int tag):根据协议类型取得具有处理该类型Profile能力的ProfileExtractor对象;

public ProfileExtractor get CreatorExtractor(int tag):根据协议类型取得具有处理该类型Profile能力的ProfileCreator对象;

Transport类


具有传送能力,他可以将指定 的字节流传送的网络的另一端。它的传送能力依赖于不同网络协议的具体实现。

public abstract TargetAddress getTargetAddress():取得Transport的另一端的TargetAddress对象;

public abstract java.io.InputStream getInputStream():取得输入流对象,用于从网络读取字节流;

public abstract java.io.OutputStream getOutputStream():取得输出流对象,用于香网络输出字节流;

public abstract void teardown(boolean wait):销毁该对象表示的连接;

以上的几个方法都是抽象方法,当映射的具体的传输协议时,这些方法都需要实现;

TransportPool类


TransportPool类根据不同的TargetAddress索引了所有的Transport对象。它具有一定程度上的连接管理功能。

public void setStrategy(int stra)

public Transport getTransport(TargetAddress a)

public void putTransport(Transport t)

public void removeTransport(Transport t)

ProtocolInitializer类


如果要使用某个网络协议作为底层传输协议,它必须继承ProtocolInitializer并重载它的setup方法,setup方法是ProtocolInitializer唯一的方法,使得每个协议实现有机会做一些准备工作(主要是注册一些对象,比如ProfileCreator和ProfileExtractor的协议相关实现对象)。

Listener类


Listener对象一般在ORB中只有一个,它负责监听网络请求,它是一个单独的线程;如果监听到了请求,Listener对象会接受连接,并从ServerWorkerRegistry中取出一个可用的ServerWorker对象,ServerWorker对象也是一个线程;当前是否有可用的ServerWorker对象取决于线程池的策略的设置。

IIOP模块说明

IIOP模块就是是orbas使用的缺省传输协议,它也是一个pluggable protocols framework到tcp传输协议映射实现的一个例子。

IiopChannel类

IiopProfileCreator类

IiopProfileExtractor类

IiopProtocolInitializer类

IiopTransport类


ORB的结构
ORB对象的属性

IOR:

IorParser类


IorParser可以分析ior,从ior中分析出其中含有的各种结构; FileParser类

它可以分析文件类型的ior;

CorbaLocParser类

它用来分析URL形式的CORBALoc;

HttpParser类

用于支持http协议;

CodeSet

目前还没有实现

Thread和Connection Management


ORB的线程模型不同与POA的线程模型。ORB的线程模型可以分为每客户一个线程和线程池模型。在每客户一个线程模型中,每当有用户连接,ORB都spawn一个新的ServerWorker线程对象,来处理它对应的客户的请求;在线程池模型中,每当有客户发起连接时,ORB接受这个连接,当它会查询在ServerWorkerRegistry中是否有可用的ServerWorker对象,如果没有,客户需要等待,当ServerWorkerRegistry中有了可用的ServerWorker对象以后,客户的请求才得以处理。

typecode与ORB

TypeCodeBase类:

所有不同类型TypeCode类型实现的基类,它继承了org.omg.CORBA.TypeCode类,实现equivalent方法;

TypeCodeFactory类:

提供了创建所有TypeCode实现的接口;

TypeCode*类:所有的TypeCode的实现;

ORB与pluggable protocols framework

配置缺省的IOP协议引擎和网络传输协议:

可以制定orbas使用一种缺省的IOP协议引擎。ORB的方法getDefaultClientWorker返回配置文件制定的IOP协议引擎。

配置网络传输协议:所有的网络传输协议映射实现都要在配置文件中指明;ORB初始化时,会根据配置文件调用所有网络传输协议映射实现的初始化。在以后的运行中,orbas会根据ior中指明的协议类型选用何时的网络传输协议。当使用orbas构造服务器时,要指明它使用的缺省网络协议。

ORB与POA的接口

Objectkey用于标识一个分布对象;它实际上标识了实现(incarnate)这个分布对象的对象实现在进程中的位置信息。它由一组poa的名字和一个objectId组成。根据objectkey中所包含的poa的名字序列,可以从rootPOA找到管理对象实现的poa;而该poa根据objectid从ActiveObjectMap中能找到objectkey标识的对象实现的引用。

当请求从当前工作的ServerWorker对象流到invokeEngine对象时,invokeEngine从请求流中得到objectkey,然后调用org.huihoo.orbas.poa.ObjectKeyExtractor对象对objectkey进行解码,得到poa的名字序列和objectId;然后根据poa的名字序列找到我们所需要的poa,在使用objectId从poa返回org.omg.PortableServer.Servant对象,然后构造InvokeHandler的_invoke方法的参数并调用之;得到返回值后,把它们发送到网络中。

根据以上描述的相应客户请求的过程,org.huihoo.orbas.poa.POA_impl类继承OrbasPoa接口。本接口提供了一个invoke方法,OrbasPoa是实现pluggable poa的基础。原型如下:

public org.omg.CORBA.portable.OutputStream invoke(org.omg.PortableServer.ObjectId oid,

String method,

org.omg.CORBA.portable.InputStream is,

ResponseHandler handler)

throws org.omg.CORBA.OBJECT_NOT_EXIST;

ORB提供给POA的接口:ORB提供给POA的接口有:

createIor方法:createIor方法用于POA创建对象引用。它的原型如下:

public org.omg.CORBA..portable.InputStream createIor(byte[] objectKey, String typeId);

POA首先自己生成objectkey,然后调用createIor得到一个CDRInputStream流;然后使用如下过程生成对象引用:

IorParser parser = new IorParser(orb, inputStream);

Org.omg.CORBA.Object obj = parser.getObject();