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(); |