JacORB1.4 编程指南

上传人:仙*** 文档编号:32413477 上传时间:2021-10-14 格式:PPT 页数:48 大小:1.54MB
收藏 版权申诉 举报 下载
JacORB1.4 编程指南_第1页
第1页 / 共48页
JacORB1.4 编程指南_第2页
第2页 / 共48页
JacORB1.4 编程指南_第3页
第3页 / 共48页
资源描述:

《JacORB1.4 编程指南》由会员分享,可在线阅读,更多相关《JacORB1.4 编程指南(48页珍藏版)》请在装配图网上搜索。

1、JacORB1.4 编程指南中文翻译:hlstudio() ,cocia()(第 7 章)校稿:allen(),fat1()2002.08目录12345678前言 . 4安装 JacORB. 52.1 获取 JacORB. 52.2 安装 JacORB. 52.2.1 Ant 和 build.xml. 52.2.2 配置 . 5编程起步 . 93.1 JacORB 开发步骤. 93.2 IDL 接口定义 . 93.3 生成 Java 类. 103.4 实现接口. 103.5 编写服务器. 113.6 编写客户端. 123.7 桥接方式. 13JacORB 命名服务. 154.1 运行命名服务.

2、 154.2 访问命名服务. 164.3 构造层次命名空间. 164.4 命名管理器. 16服务端:POA 及线程 . 185.1 POA. 185.2 线程. 18实现仓库 . 196.1 概述. 196.2 使用 JacORB 的实现仓库. 196.3 服务迁移. 206.4 安全考虑. 21Any Value 的动态管理. 227.1 概述. 227.2 接口 . 227.3 用法限制. 227.4 创建一个 DynAny 对象 . 237.5 访问 DynAny 对象的值 . 247.6 传送 DynAny 对象的值 . 247.7 构造类型. 257.7.1 DynEnum. 257

3、.7.2 DynStruct. 257.7.3 DynUnion . 257.7.4 DynSequence . 257.7.5 DynArray . 257.8 Any 和 DnyAny 对象之间的转换 . 267.9 更多例子. 26接口仓库 . 278.1 接口仓库中的类型信息. 2728.2 接口仓库设计. 278.3 使用接口仓库. 28910111213141516JacORB 的小程序代理. 309.1 使用小程序代理. 309.1.1 使用步骤 . 309.1.2 程序属性 . 309.1.3 小程序代理和 Netscpe/IE,AppletViewer. 319.1.4 示例

4、 . 319.2 通过防火墙使用 JacORB. 319.2.1 小程序代理 . 319.2.2 HTTP 隧道 . 329.2.3 小程序代理和 HTTP 隧道 . 329.2.4 总结 . 32基于 SSL 的 IIOP. 3310.1 重编译 JacORB 安全库. 3310.2 配置 IAIK . 3310.2.1 设置 IAIK 证书库. 3310.2.2 一步一步生成证书 . 3510.3 配置 SSL 的属性 . 3510.3.1 客户端配置 . 3610.3.2 服务器端配置 . 36双向 GIOP. 3711.1 设置双向 GIOP. 3711.1.1 设置 ORB 初始属性

5、 . 3711.1.2 创建双向策略 . 3711.2 验证双向 GIOP 已经使用. 3711.3 TAO 协同性. 38可移植拦截器-PI . 39JacORB 实用程序. 4013.1 IDL . 4013.2 ns . 4013.3 nmg. 4113.4 lsns. 4113.5 dior . 4113.6 pingo. 4113.7 ir . 4113.8 qir . 4213.9 ks . 42配置清单 . 4314.1 ORB 的配置. 4314.2 POA 的配置. 4414.3 实现仓库的配置. 4514.4 安全的配置. 45缺陷和反馈 . 47附录 . 48341 前言

6、本文主要介绍 JacORB 的分布式应用开发。JacORB 是免费的 Java 对象请求代理系统,附带全部源代码,包含大部分 CORBA 对象服务的实现,以及大量的代码实例。本文不是CORBA 的一般性介绍,如果要看 CORBA 方面的介绍,请查阅附录的参考书目BVD01及HV99。本文所描述的 JacORB 版本为 1.4Beta1,同时介绍一些安装和使用 JacORB 的技巧。52 安装 JacORB本章的主要内容是获取和安装 JacORB,以及相关包的主要内容。2.1 获取 JacORBJacORB 可以在 JacORB 的主页 http:/www.jacorb.org 下载,也可以通过

7、匿名方式访问 FTP 服务器 ftp.inf.fu-berlin.de 目录 pub/jacorb 来下载。下载的文件是压缩包,unix 为 tar 格式,windows 下为 zip 格式。要安装 JacORB,先解压缩,会生成一个新的目录 JacORB1_4_beta1。然后将JacORB1_4_beta1/lib/jacorb.jar加入入入入入(classpath)入入入入入入入入入入JacORB, JacORB1_4_beta1/class 加入类路径,并且将JacORB1_4_beta1/bin 加到 Path,在 JacORB1_4_beta1/bin 下有一些实用程序。2.2

8、安装 JacORB2.2.1 Ant 和 build.xmlJacORB 可以在所有的 Java 虚拟机上运行。重新编译 JacORB(以及 JacORB 附带的例子)需要安装 Ant,Ant 是基于 XML 的制作管理工具。你可以到http:/jakarta.apache.org/ant下下下入下下下Ant入下下下build.xml下下下下下下下下下入,入入入入JacORB,入新新新新新新新(JacORB1_4_beta1)入新入ant新新新新入新新新ant新新新前,新前新新ant clean前前前前前入入产生的中间文件。最好使用 JDK1.2 以上的版本的虚拟机来运行 JacORB,因为图

9、形工具如使命名管理器(NameManger)、实现仓库管理器(ImRManger)、接口仓库浏览器(IRBrowser),以及 SSL 的支持都需要 JDK1.2 以下版本的虚拟机。在使用 SSL 时,你还需要第三方的 SSL 协议实现,JacORB 目前支持以下的实现:1.IAIKs下的的,的的新IAIKJCE 2.5或或或下下入,前或SSL下或iSaSiLk3.0入。的的入新前。下。入2.Sun 的 JSSE 参考实现,包含在 JDK1.4 中;也可单独从 JDC 中下载。2.2.2 配置JacORB 有很多可以设为 Java 属性的配置项。在解释这些基本配置项之前,先让我们看看配置方法。

10、其他一些具体的配置项,如和实现仓库及交易服务相关的选项,在相关的章节讲述。总体说来,有三种方式可以配置 JacORB。第一种方式是文件方式。JacORB 寻找和加载名为.jacorb_properties 或 jacorb.properties 文件,系统将在下列位置搜索配置文件:1.类路径中。2.运行 JacORB 用户的用户主目录,通过运行 System.getProerty(user.home)获得。如果需要知道用户主目录在哪,可以写一小段 Java 程序去测试一下。3.当前目录中。4.JDK 安装的 lib 目录。JDK 的主目录通过运行 System.getProperty(java

11、.home)获得。系统也按上述顺序搜索,一旦找到一个配置文件,系统将停止搜索,并加载该配置文件。第二种方式是对象方式。对于和应用相关的配置项,可以在应用初始化时给 ORB.init 传递一个 java.util.Property 对象。这种方式会覆盖使用文件方式设置的配置项。下面的代码片段演示了如何向 ORB.init 传递一个 Property 对象(程序中 args 是命令行参数变量):java.util.Properties props = new java.util.Properties();props.setProperty(jacorb.implname,StandardNS);/

12、 use put() under Java 1.1org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props);第三种方式是参数方式。可以通过设置 Java 虚拟机的系统属性来设置配置项,这些属性必须在调用 ORB.init()之前设置,并且此方式会覆盖前两种方式设置的配置项。系统属性可用System.setProperty,也可以用命令行参数方式 -D=,这是 Java 程序的命令行参数,也可用于 jaco 脚本。需要注意的是这些参数必须放在类名参数之前,放在类名参数之后的都将被 Java 虚拟机解释为该类的参数,并只被传递到该类的

13、main 方法中。如果你想通过命令行设置多个参数,你可以用一个特定的属性 custom.props,此属性值为配置文件。在配置文件中你可以加上任意多的配置项。这里的配置项也会覆盖第一种和第二种方式设置的配置项。例如:通常使用标准的 TCP/IP 连接,但可能有时候想使用 SSL。如果只使用一个配置文件,那么要变更连接方式时就得修改配置文件。如果不想每次都修改配置文件,也可以将不同的参数通过命令行参数传递,但这会导致很长的命令。但如果使用特定的属性去指定文件,就可以把所有其他的配置项都放在该文件中,而只使用一个命令行参数,如:$ jaco -Dcustom.props=ssl_props_MyS

14、erver我们现在看一看最基本的配置项,下面是一个示例的配置文件:# JacORB 配置项# # 初始化的参考配置# # IORs存储的URL (在orb.resolve_initial_service()中使用)# ORBInitRef在ORB启动时创建. In the# cases of the services themselves, this may lead to exceptions being# displayed (because the services arent up yet). These exceptions# are handled properly and cau

15、se no harm!#ORBInitRef.NameService=corbaloc:160.45.110.41:38693/StandardNS/NameServer POA/_root#ORBInitRef.NameService=file:/c:/NS_RefORBInitRef.NameService=http:/www.x.y.z/user/NS_Ref#ORBInitRef.TradingService=http:/www.x.y.z/user/TraderRef# JacORB-specific URLsjacorb.ImplementationRepositoryURL=ht

16、tp:/www.x.y.z/user/ImR_Refjacorb.ProxyServerURL=http:/www.x.y.z/user/Appligator_Ref# #6# 调试模式# # use (java) jacorb.util.CAD to generate an appropriate# verbosity level# 0 = off# 1 = important messages and exceptions# 2 = informational messages and exceptions# = 3 = debug-level output (may confuse th

17、e unaware user :-)jacorb.verbosity=1# where does output go? Terminal is default#jacorb.logfile=LOGFILEPATH# # WARNING: The following properties should # only be edited by the expert user. They # can be left untouched for most cases! # # # 基本ORB配置# # number of retries if connection cannot directly be

18、 establishedjacorb.retries=5# how many msecs. do we wait between retriesjacorb.retry_interval=500# size of network buffers for outgoing messagesjacorb.outbuf_size=2048# client-side timeout, set no non-zero to stop blocking# after so many msecs.#jacorb.connection.client_timeout=0# max time a server k

19、eeps a connection open if nothing happens#jacorb.connection.server_timeout=10000#jacorb.reference_caching=off.# # POA配置# # displays a GUI monitoring tool for serversjacorb.poa.monitoring=off# thread pool configuration for request processingjacorb.poa.thread_pool_max=20jacorb.poa.thread_pool_min=5# i

20、f set, request processing threads in thePOA# will run at this priority. If not set or invalid,# MAX_PRIORITY will be used.#jacorb.poa.thread_priority=# size of the request queue, clients will receive Corba.TRANSIENT# exceptions if load exceeds this limitjacorb.poa.queue_max=100.配置项包括网络缓冲区的大小、JacORB

21、在不能建立连接时的重试次数、在重试前等待的时间间隔。ORBInitRef.NameService 的值是 JacORB 命名服务的 URL。这个 URL 被 ORB 用来定位存储服务对象引用的文件(请参见第 4 章)。verbosity 配置项指定 JacORB 在运行时可以忽略多少诊断输出。除非将 logfile 配置78项设定为一个文件,否则系统将向终端输出日志。将 verbosity 置为 0 意味着不输出任何诊断信息,2 为详细诊断信息输出。1 则忽略某些信息,例如忽略连接打开、接受和关闭的信息。如果想可选的输出一些诊断信息,可以使用 jacorb.util.CAD 工具生成一个自定义

22、的输出级别。配置项 jacorb.poa.monitoring 指明 POA 是否打开一个图形界面显示自身的动态信息,例如有多长的请求队列,有多大的线程池。同时,这个工具也可以用来修改 POA 的状态,从活动到保持,详细说明可以参见第 5 章。现在就可以在 demo 目录下任一子目录来测试安装。在此目录下有很多 JacORB 的例子。93 编程起步在开始讲述例子之前,我们先看一下在 JacORB 中开发 CORBA 应用的基本步骤。我们也按照这个基本步骤来讲述例子。例子请参见 demo/grid 目录,在此目录有一个 build.xml,用以使用 ant 来制作,这样不用每回都手工运行每一开发

23、步骤,当然还是应该搞清楚开发的原理。本文只是 JacORB 编程的简短介绍,不会涉及 CORBA IDL 的所有细节,建议看看 demo 下的其他例子,这些例子是按照 CORBA IDL 的方式进行组织的。3.1 JacORB 开发步骤JacORB 的应用开发一般分为以下五步:1.写 IDL 接口定义2.编译 IDL 接口定义生成 Java 类3.实现步骤 2 中生成的接口4.写服务器启动类,并注册到 ORB5.写客户端去获取服务对象引用3.2 IDL 接口定义本例实现了一个简单的服务,其接口在 server.idl 中定义。本例所有的源代码都可以在jacORB1_4_beta1/demo/g

24、rid 目录下找到。下面是 server.idl 文件的内容:/ server.idl/ 二维网格的接口定义:module demomodule gridinterface MyServertypedef fixed fixedT;readonly attribute short height; / 网络的高度readonly attribute short width; / 网络的宽度/ 设置n*m的网络void set(in short n, in short m, in fixedT value);/ 返回n*m的网络元素fixedT get(in short n, in short m

25、);exception MyExceptionstring why;short opWithException() raises( MyException );103.3 生成 Java 类使用如下命令编译此接口文件:$idl -d ./. server.idl此命令将生成多个 Java 源文件,Java 源文件的生成依照 OMG 标准的 IDL-Java 语言映射定义。如果你对语言映射定义感兴趣,例如 IDL 的语言结构如何映射为 Java 的语言结构,可以到 www.omg.org 上查找相关文档。JacORB 的 IDL 编译使用 CORBA2.3 定义的语言映射,详细说明可参考附录的参

26、考书目BVD01。如何使用 idl 接口定义,可参考 demo 目录下的例子。IDL 编译器产生 Java 接口 MyServer、MyServerOptions,及桩和骨架文件_MyServerStub、MyServerPOA、MyServerPOATie。我们将在后面详细这几个类。注意 IDL 编译器将会产生一个和 IDL 接口文件中定义模块相对应的目录结构。如果我们不指定-d ./.,将在当前目录下创建 demo/grid 子目录。如何存放生成的 Java 源文件各有所好,有人喜欢所所有的文件都放在一个地方(可以使用-d选项),有人喜欢一个目录存放生成的的源文件,另外一个目录存放 Jav

27、a 编译产生的 class 文件。3.4 实现接口现在我们来实现接口定义中描述的功能。这个 Java 类命名为 gridImpl,除了要实现接口定义中描述的所有功能外,gridImpl 还应该是在前面生成的类 MyServerPOA 的子类。MyServerPOA 中包含接受远程调用和将结果返回给客户的端的相关代码。你也许注意到当 gridImpl 要继承另外一个类时,这种方式就有局限性。因为 Java 只允许继承一个父类,在后面将讲到用桥接方式解决这个问题。这是 gridImpl 的源代码,在代码中使用 java.math.BigDecimal 来保存接口定义中的 fixedT 类型。pac

28、kage demo.grid;/* A very simple implementation of a 2-D grid*/import demo.grid.MyServerPackage.MyException;public class gridImpl extends MyServerPOAprotected short height = 31;protected short width = 14;protected java.math.BigDecimal mygrid;public gridImpl()mygrid = new java.math.BigDecimalheightwid

29、th;for( short h = 0; h height; h+ )for( short w = 0; w width; w+ )mygridhw = new java.math.BigDecimal(0.21);public java.math.BigDecimal get(short n, short m)if( ( n = height ) & ( m = width ) )return mygridnm;11elsereturn new java.math.BigDecimal(0.01);public short height()return height;public void

30、set(short n, short m, java.math.BigDecimal value)if( ( n = height ) & ( m = width ) )mygridnm = value;public short width()return width;public short opWithException()throws demo.grid.MyServerPackage.MyExceptionthrow new demo.grid.MyServerPackage.MyException(This is onlya test exception,3.5 编写服务器这一步要写

31、一个类来调用 gridImpl 类,并将其注册到 POA,这样远程对象才能通过MyServer 接口来访问它。以下是这个类的源代码:package demo.grid;import java.io.*;import org.omg.CosNaming.*;public class Server/ public static void main( String args )org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);tryorg.omg.PortableServer.POA poa =org.omg.PortableSer

32、ver.POAHelper.narrow(orb.resolve_initial_references(RootPOA);poa.the_POAManager().activate();org.omg.CORBA.Object o = poa.servant_to_reference(newgridImpl();if( args.length = 1 )/ write the object reference to args0PrintWriter ps = new PrintWriter(new FileOutputStream(new File( args0 );ps.println( o

33、rb.object_to_string( o ) );ps.close();else/ register with the naming serviceNamingContextExt nc =NamingContextExtHelper.narrow(orb.resolve_initial_references(NameService);nc.bind( nc.to_name(grid.example), o);12catch ( Exception e )e.printStackTrace();orb.run();在初始化ORB之后,要获取一个POA的引用。ORB可以通过RootPOA来获

34、取一个初始引用,此引用只是一个CORBA.Object,需要使用POAHelper来实例化为POA的引用。下一步是激活该对象,因为引用刚创建时是“保持”状态,在这种状态下,不能处理任何请求。通过调用POA的POAManager对象的activate()方法将POA激活。现在就可以通过POA将一个Java对象转化成一个CORBA对象。为了使新创建的CORBA对象能被客户端访问,我们要提供该对象的引用。这一过程通过目录服务-命名服务器-来完成。命名服务 器的引用通过调用orb.resolve_initial_references(NameService),然后用org.omg.CosNaming.

35、NamingContextExtHelper的narrow()方法实例化为正确的命名服务器对象。最后,调用命名服务器的bind()方法将CORBA对象引用进行发布。对象的名称作为bind()的参数传入,当然,不能只传递一个字符串,而是应传入代表名称的CosNaming.NameComponents对对入新前对入,对对对。对对下对对下新的的的,新前的的的,的名名名下的名对对入3.6 编写客户端下最,最对对前最对最。下入最最。的的最最下最package demo.grid;import org.omg.CosNaming.*;public class Clientpublic static voi

36、d main(String args)tryMyServer grid;org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null);if(args.length=1 )/ args0 is an IOR-stringgrid =MyServerHelper.narrow(orb.string_to_object(args0);elseNamingContextExt nc =NamingContextExtHelper.narrow(orb.resolve_initial_references(NameService);grid = My

37、ServerHelper.narrow(nc.resolve(nc.to_name(grid.example);short x = grid.height();System.out.println(Height = + x);short y = grid.width();System.out.println(Width = + y);x -= 1;y -= 1;13System.out.println(Old value at ( + x + , + y +): +grid.get( x,y);System.out.println(Setting ( + x + , + y +) to 470

38、.11);grid.set( x, y, new java.math.BigDecimal(470.11);System.out.println(New value at ( + x + , + y +): +grid.get( x,y);trygrid.opWithException();catch (jacorb.demo.grid.MyServerPackage.MyException ex)System.out.println(MyException, reason: + ex.why);catch (Exception e)e.printStackTrace();在初始化ORB之后,

39、客户端通过命名服务器获取一个grid服务的引用。如上所述,通过调用orb.resolve initial references(NameService)获取命名服务,使用resolve()方法在命名服务器上查找grid的引用。返回的结果是org.omg.CORBA.Object对象,需要实例化为MyServer。在将所有的Java类都成功编译以后,现在可以在不同的Java虚拟机中启动服务器和客户端。当然,应该是命名服务最先启动,如果命名服务还没有启动,使用以下命令来启动:$ns /home/me/public_html/NS_Ref/home/me/public_html/NS_Ref是一个本

40、地的可写文件,服务器和客户端都可以通过URL的方式访问。这样,可以不使用端口号,而服务器和客户端都可以获取命名服务的引用,从而实现互相访问。启动服务器:$jaco demo.grid.Server接着,运行客户端:$jaco demo.grid.Client运行客户端产生以下输出:Height = 31Width = 14Old value at (30,13): 0.21Setting (30,13) to 470.11New value at (30,13): 470.11MyException, reason: This is only a test exception, no harm

41、 done :-)done.3.7 桥接方式如果在实现接口已经继承了另外一个类,而不能继承MyServerPOA时,可以使用桥接方式。简言之,这种方式将继承改为指派,不是继承MyServerPOA,则是实现MyServerOperations接接入package demo.grid;import demo.grid.MyServerPackage.MyException;public class gridOperationsImpl implements MyServerOperations14.的的服服。前下的服的的最package demo.grid;import java.io.*;im

42、port org.omg.CosNaming.*;public class TieServerpublic static void main( String args )org.omg.CORBA.ORB orb =org.omg.CORBA.ORB.init(args, null);tryorg.omg.PortableServer.POA poa =org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references(RootPOA);/ use the operations implementation and wr

43、ap it in/ a tie objectorg.omg.CORBA.Object o =poa.servant_to_reference(new MyServerPOATie( new gridOperationsImpl() );poa.the_POAManager().activate();if( args.length = 1 )/ write the object reference to args0PrintWriter ps = new PrintWriter(new FileOutputStream(new File( args0 );ps.println( orb.obje

44、ct_to_string( o ) );ps.close();elseNamingContextExt nc =NamingContextExtHelper.narrow(orb.resolve_initial_references(NameService);NameComponent name = new NameComponent1;name0 = new NameComponent(grid, whatever);nc.bind( name, o );catch ( Exception e )e.printStackTrace();orb.run();4JacORB 命名服务新的的的。命

45、命下的服命命对对,。入最命,。命,命命服命命命的命入入入新前。的的的命命找找找找的的下对对,。找新前,。找找找找的的下对对新找入的名命的的下找命下找找对。前户下户户下入JacORB的的对OMG下实实新的的的(INS),找找,的实找命下对对实。,实实的实命找对对实。下功功入,找找功功最。新功功功功的新的实命实功功新功功新名功入JacORB新的的的功功功功组组最对下下的的最最,组对下下对组新前。的的最最下入命接接入新。JDK1.2前前下下在,新,在在JDK下功在命新的的的和找下入下实在对,和和和新bug,下和,将将JacORB,功将将下实入下对,下入下。将下入,下命。NamingContextEx

46、t来代替NamingContext接口,否则,总会碰到空指针或其他异常。在JDK1.1 中没有这些问题。4.1 运行命名服务JacORB命名服务是一个程序,需要在访问前启动。使用如下命令启动:$ns 也可以通过java程序直接启动:$jaco jacorb.naming.NameServer 在上例中$ns /home/me/public_html/NS_Ref命名服务将位置信息和日志信息写入/home/me/public_html/NS_Ref文件中。客户端使用这个文件来定位命名服务。但是,在默认情况下,客户端并不是通过本地或共享文件的方式来读取该文件,而是使用URL通过http协议来访问。

47、这也表明命名服务日志文件可能通过HTTP方式进行访问,如果知道位于域中哪一个Web服务器中。这种实现方式的优点在于客户端不必知道命名服务的端口号,而是通过URL的方式来访问。如果想限制命名服务在域中的可见性,或者无法访问一个Web服务器,那么可以使用文件URL的方式来代替HTTP的URL方式,例如,可以使用如下方式file:/home/brose/public_html/NS_Ref来替代http:/www.inf.fu-berlin.de/brose/NS_Ref使用URL的方式也方便没有网络连接的机器,请注意HTTP协议并不总能被使用,当客户端已经定位命名服务以后,后续的请求将使用标准的C

48、ORBA方法调用,也就是使用IIOP协议(基于TCP/IP)。命名服务将自身的内部状态,例如在命名空间中绑定的名称,存储在当前目录的文件中。目录也可以用参数jacorb.naming.db_dir来指定。当命名服务正常终止时,内部状态都将被保存,但使用Kill或Control-C时会造成数据丢失。如果状态文件存在且不为空,命名服务就能从该文件中恢复状态。第二个参数是以毫秒计算的超时值。如果这个参数被设置,则命名服务在到运行指定时间后,将保存状态并正常关闭。这种方式在命名服务注册到实现仓库时很有用,这样,命名服务可以按需启动。配置根命名空间配置一个命名空间(例如命名服务)作为ORB根命名空间,只

49、需要将启动文件指定到配置文件.jacorbproperties即可。也可以将启动文件设为配置项ORBInitRef.NameService的值。在根命名空间配置好以后,对象NamingContextExt下下下最。下,。orb.resolve_initial_references(NameService),新的的的,或,的的,或,入15164.2 访问命名服务新JacORB入实实通通下CORBA命通的服。新的的的最/获取命名服务的引用ORB orb = ORB.init(args, null);org.omg.CORBA.Object o = orb.resolve_initial_refer

50、ences(NameService)NamingContextExt nc = NamingContextExtHelper.narrow( o );/查找对象server s =serverHelper.narrow( nc.resolve(nc.to_name(server.service) );在查找对象之前,需要获取命名服务的引用。获取引用的标准方式是调用orb.resolve_initial_references(NameService),。下,的服最。,对对下新的的的,对对的实下对下NameComponents数组功新数数,下数功数数数数的名入实实下,的服,新前数构下数对下数组,构

51、命的的下的下server,入构下service,构,。构命对下新的构功入组构,新前最。接接NamingContextExt的方法to_name()将字符串server.service转化结构名称。然后,可以在名称命名空间中调用resolve()方法来查找对象,并传递一个结构名称作为参数。4.3 构造层次命名空间就象文件系统的目录结构一样,命名空间也可以包含其他的命名空间,从而构成层次结构,而不是平面结构。对象的结构名称的各部分就构成了名称的路径,在最内层的命名空间中绑定对象的名称。这可以使用命名管理器实现,或者通过编码实现。在已有的命名空间中创建新的子命名空间可以通过new_context()

52、或bind_new context()方法。下面的代码片段演示了如何创建一个子命名空间,并返回它的引用:/ get a reference to the naming serviceORB orb = ORB.init();org.omg.CORBA.Object o =orb.resolve_initial_references(NameService);NamingContextExt rootContext =NamingContextExtHelper.narrow( o );/ look up an objectNameComponent name = new NameCompone

53、nt1;name0 = new NameComponent(sub,context);NamingContextExt subContext =NamingContextExtHelper.narrow( rootContext.bind_new_context( name );请注意在JacORB中总是在内部使用NamingContextExt对象,即使代码中写的是NamingContext对象,原因在前面已经描述过。4.4 命名管理器如果使用JDK1.2 以上的Java虚拟机,或带有JFC相关类。图形界面的命名管理器就可以通过以下命令启动:$nmg命名管理器启动以后查找根命名空间并显示其内

54、容,请看屏幕截图:17命名管理器有绑定名称,创建子命名空间的菜单。如图,右击RootContext,在弹出的菜单中选择newcontext,输入名称,可创建子命名空间。5服务端:POA 及线程本章介绍JacORB提供控制服务启动和运行的应用及接口,包括激活服务、可移植对象适配器(POA)、线程。本章只给出一个POA的简单介绍,并不涉及如何使用POA不同的设置和不同的策略,详细信息可以参考附录的参考书目BVD01,也可参考另一书目HV99,Vin98入入最新C+入。新。命。http:/www.cs.wustl.edu/schmidt/report-doc.html前下和找上上,下上下。下CORB

55、A上上入5.1 POAPOA提供复杂的接口来管理对象引用及伺服程序。使用POA接口写的代码现在可以在兼容CORBA2.2或以上版本的各个ORB中移植。POA定义了以下几个方面的标准接口:!映射对象引用到实现对象的伺服程序!允许透明地激活对象!将策略信息绑定到对象!可以在几个服务进程中持续化CORBA对象在POA规范中,已经废弃了伪IDL的使用,而直接使用标准IDL,使用标准的语言映射定义来将IDL映射为编程语言,但这有本地限制。因为这意味着对象引用不能传递到服务器地址空间以外,POA接口本身也是有本地限制的。POA是CORBA负责创建CORBA对象及对象引用的部分,并且,也有助于骨架(skel

56、eton)将请求调度到真正的对象。为了和实现仓库一致,也可以激活对象,例如,启动提供CORBA对象程序的进程。5.2 线程JacORB提供服务器端线程模式。POA负责调度中央线程池从中获得一个线程来处理请求。线程池的大小由参数jacorb.poa.thread_pool_max和jacorb.poa.thread_pool_min决定。当一个请求到达时,如果线程池中的所有线程都忙,并且线程总数小于jacorb.poa.thread_pool_max时,会启动一个新线程来处理请求。否则,请求将会阻塞直至有可用的线程。当线程处理完一个请求之后,必须决定是返回线程池还是被销毁。当线程池已经超过最小值

57、时,处理中的线程不会返回线程池,从而保证线程池总在最大值和最小值之间。将最小值设置为大于 1,意味着在线程池中总有一些线程处于激活状态等待处理请求。这对于请求以脉冲方式到达的情况最为有效。限制线程池的最大值可以防止服务器占用过多的资源。请求处理线程通常以较高的线程优先级运行。线程优先级通过参数jacorb.poa.thread_priority来设置,参数值为Thread.MIN_PRIORITY、Thread.MAX_PRIORITY、Thread.NORMAL_PRIORITY新对,入入之之之之,JacORB,之之之下Thread.MAX_PRIORITY入186实现仓库实现仓库(ImR)

58、并不象其名所表述的,是一个保存实现的数据库。相反,它只保存如何将请求调度到真正的CORBA对象,如何实例化一个实现的信息。实例化一个实现是指启动一个包含所需CORBA对象的服务程序。在本章我们只是简单介绍如何使用实现仓库,详细信息请参考HV99。6.1 概述对一的,的的,或入一和一,入最。一一对对实。下一一入对下一一对对实。下POA实实一一一新命命命命下入下在命找对对下一新命命命命命命下POA命命一入新的的,或入。一一对对实。,的的,或找新前,。找找,一,入前在,对对下,和新,入入,和新,找命命对下入下对为入下下新下,的的,或为为为为为下一,命一一对对下找为入下对为新前实实入下一一对对实。,。

59、之的的的的,或下的命一一,构,下的的的的最最的命一一前为入入引。,一,引引入为的的,或,构,下的实下的的最最,引下的的最最新功新一,入为在和,和新入入入下数下一,入为的的,或,的的,或引引新达功达入命找的的下一一,达达下下的的对对和,和新,入入,和新,的的,或下,下一一前,对下和找下的的对对,新的的对对,前前最,的的,或,。对下LOCATION_FORWARD下一将,新。一将入,的的入的的对对实。,下数,。功户户的。入的的对对实。前。一,入6.2 使用 JacORB 的实现仓库JacORB的的,或功功功功组组最,或功最,新实入新和新对下实的的,功最,新为对实新,下的的下的命前下,下对下入在在,

60、新,对下。下下功理一新命命理理对对下功最入引引,为为引,入首,或功最(新的的,或)最$imr -n -p -i -f -b -a的的,或。实之实ORBInitRef.ImplementationRepository前命命入下下来理上来为为之之入对下新。下WEB的的服前,和和的的,或下IOR功,置置入下对置,功最新新,下的命前,。入下新新最$imr_ssd,功最,在,命当命的的,或实当入。前下新新,新前,下的的在以入的的,或,新功。的的,或下以最的命下新前。新新入$imr_mg add AServerName -c jaco MyServerimr_mg新新下命实的的,或下实。新新入新前命新新入

61、,。数add构户,的的在以入的的,或,命接着下。数下的的的,入入的的下新的命,下下命,命新,。数-hhostname前构命新下的命入下最,的的,或新,为为入最,的的,功。数-c 前构命,jacoMyServer户户对入最,下的的入-c。数下参服命,的的下新新对数,下下新新为为的的下新的命功新新入入新Windows下新前。start jaco MyServer,的的,入将将下将将实入,新unix下将新前。xterm -e jaco MyServer来实现同一目的。启动命令作为一个字符串将完整直接地传递到Runtime.exec()方法中,不会被解释或修改。因为Runtime.exec()是和平台

62、相关的,所以启动参数也和平台相关。大多数unix系统中可以使用*或来防止shell解释,windows系统不将字符串传递给命令行解释器,因此,即使在dos提示符下输入jaco MyServer能执行,也不能保证将此字符串作为imr_mg能成功。最好将启动命令封装成直接调用命令行解释器,在NT下,使用如下命令:cmd /c jacoMyServer入一,。,新。imr_mg之之,新新在,新新入下。实。功新名。入入入,入最的的功的的,或如,新前之之实之实jacorb.imr.allow_auto_register或1920使用实现仓库命令的-a参数。如果此配置项被设置,在POA激活时,实现仓库交自

63、动为服务创建一个新配置,如果服务以前没有注册到实现仓库,那么,不能通过实现仓库管理器来注册该服务。客户端需要一个服务对象引用来提交请求,直接现在,我们还没有提到如何将持久对象引用激活的问题。引用创建和通常一样,当一个引用被创建成可持久化,POA必须使用持久生命周期策略来创建它,如以下代码所示:/* 初始化ORB和根POA */orb = org.omg.CORBA.ORB.init(args, props);org.omg.PortableServer.POA rootPOA=org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial

64、_references(RootPOA);/* 生成策略 */org.omg.CORBA.Policy policies = new org.omg.CORBA.Policy2;policies0 =rootPOA.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID);policies1 =rootPOA.create_lifespan_policy(LifespanPolicyValue.PERSISTENT);/* 创建POA */POA myPOA = rootPOA.create_POA(XYZPOA,rootPOA.

65、the_POAManager(),policies);/* 激活POA */poa.the_POAManager().activate();注意,使用持久对象引用的POA其ID应设置为USER_ID,因为这个值会在保存对象状态时保存到状态库中。如果POA使用持久生命周期策略创建,并且ORB的use_imr配置项已经设置,ORB会通知实现仓库,因此,实现仓库知道不用创建一个新的对象来处理请求。只需将ORB的配置项设置为:jacorb.useimr=on新新入ORB。组对下实之实jacorb.implname实下实为下。数入入入的的,在以入的的,或,实之实下之现找命在以在。下的的的现实入新最最入新

66、前实实新新新。数-Djacorb.implname=MyName之之下下之,新前。前下设。前之之最/* create and set properties */java.util.Properties props = new java.util.Properties();props.setProperty(jacorb.use_imr,on);props.setProperty(jacorb.implname,MyName);/* init ORB */orb = org.omg.CORBA.ORB.init(args, props);,新,在当当对对当当或新找当在一和对对当当,下当来当当新,在在入新,在,对对当当新最后后名后后后组,引下新下下在,对对后功接,一,入,或新,对下下下一一一新命命下POA在以新最,后功为为的的,册。在命,功,的的实。数数,。,引下的的和,册将新。入新前册决。将下对下,新决下的决下决加实之实jacorb.imr.object_activation_sleep下之,下数,的的,或新,或命下在功前后组,样构新前样样的的找样入新的的找当在,新在的的下当当,下最下P

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!