|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果你学习的是市场营销,是销售,也许参加大课堂的学习会更合适,因为你的工作能力中有个基础就是搭建自己的人脉,示例6月份,我们谈过您为何要利用CORBA和Java手艺。本月,我要经由过程一个可用的复杂示例,让您入手下手探究CORBA手艺的很多范畴。不外,别忘了我们的方针是,创立如许一种散布式使用程序:使驻留在一台盘算机上的客户性能向运转于另外一台盘算机上的服务收回哀求。我们不想为诸如硬件或操纵体系软件等细节成绩费心,而只是想让这类服务能呼应客户机的哀求。
IDL接口
全体CORBA布局是从一个接口入手下手的,了解接口的最好办法就是想像我的汽车,对,我的汽车。固然您不熟习它,但假如我对您说:“开上我的车,带些三明治返来当午饭”,生怕您就不会嫌疑本人能不克不及驾驶我的汽车。您大概想晓得它停在那里,和开它是不是平安,可是您会确信开我的车与开您的车不同不年夜。这是由于,在各类汽车傍边,人与汽车之间的接口已高度尺度化了。我的轿车和您的跑车之间大概会有一些差别,但汽车的油门踏板、刹车和偏向盘的安装都是尺度的,您必定能轻松疾速上路。
由于CORBA与言语有关,以是它依托一种接口界说言语(IDL),来表达客户机怎样向完成接口的服务收回哀求。我们的接口就是一个办法:add()。这个办法将取两个数(两个IDL的long型数)并前往这两个数之和。上面是我们的接口盘算程序:
清单1.calcsimpl.idl
modulecorbasem{
modulegen{
modulecalcsimpl{
interfacecalculator{
longadd(inlongx,inlongy);
};
};
};
};
这个接口中的IDL关头字有:module、interface、long和in。IDL利用关头字module来创立称号空间,而且此关头字正确地映照为Java关头字package。运转IDL-to-Java编译器时,天生的Java文件将会存到名为calcsimpl的子目次中。IDL关头字interface完善地映照为Java接口,并代表一种笼统范例,由于二者都只界说您与对象通信的体例,而不触及对象的完成。IDL关头字long是一种基础的整数范例,它最少映照为一个4字节的范例,这类范例在Java代码中就是int。
想想实行远程办法挪用的机制,您就会发明界说参数传送的偏向(客户机到服务器、服务器到客户机大概双向传送)是何等的成心义。在IDL操纵中,这些偏向用in、out和inout关头字来声明,每一个参数都必需声明偏向,以便使对象哀求代办署理程序(ORB)晓得该参数的去处。这会影响到为发送而举行的参数打包、参数解包和内存办理。ORB对参数懂得得越多,它的效力就越高。关头字in标明longx和longy是从客户机传送到服务器。
.介入CORBA哀求的各个部分
IDL编译器必要IDL编译器吗?
您大概已有了ORB供给商和IDL-to-Java编译器。但假如还没有,您从那里猎取呢?这里有很多多少,并且有些还能够收费下载。我保举ObjectOrientedConcepts,Inc.的OrbacusORB。假如不将其用于贸易目标,它还能够收费下载,并且完整切合CORBA2.3标准。别的一个可试用60天的编译器是Inprise的Visibroker,也完整切合CORBA2.3标准而且可下载。如想取得这两种产物,请参阅参考材料。
接口界说今后,必需在ORB供给商供应的IDL-to-Java编译器上运转。IDL编译器是一种精致的有用程序,它天生IDL的stub和skeleton和别的撑持文件。天生的这些源文件,年夜部分将加强CORBA尺度中界说的特定IDL范例的打包功效。编译器将天生年夜部分收集探测(plumbing),这在散布式体系中十分主要。在最基础的级别中,IDL-to-Java编译器只是一个按CORBA2.3标准的界说来完成从IDL到Java言语映照的程序。手动天生这些代码既单调又费时,还简单堕落;IDL-to-Java编译器会处置这统统,以是您就不必费心啦;同时,它会用必定的划定规矩束缚您,并强迫您实行封装。IDL-to-Java编译器将把CORBA-land划定规矩强加给您的体系。
输出上面的命令,从Orbacus实行IDL-to-Java编译器,把一切天生的文件都放在CLASSPATH的输入目次下。
清单2.挪用IDL-to-Java编译器jidl--output-dirc:\_workcorbasemcalculator.idl
天生了甚么呢?这个命令天生了构建完成所必要的全体Java源文件。IDL-to-Java编译器可确保所界说的接口恪守CORBA标准的划定规矩。
.IDL-to-Java编译器文件天生
上面是这些文件:
calculator.java-这个文件叫标志接口文件。CORBA标准指出这个文件必需扩大IDLEntity,而且与IDL接口同名。这个文件供应范例标志,从而使这个接口能用于别的接口的办法声明。
calculatorOperations.java-这个文件内含Java大众接口--calculatorOperations。标准指出,这个文件应当与具有Operations后缀的IDL接口同名,而且这个文件内含此接口映照的操纵标志。下面界说的标志接口(calculator.java)可扩大这个接口。
calculatorHelper.java-计划helper类的目标是,让所必要的很多外务处置功效离开我们的接口,但又随时可用到完成过程当中。匡助程叙文件含有主要的静态narrow办法,这类办法使org.omg.CORBA.Object压缩为一种更详细的范例的对象援用;在这类情形下,将是一个盘算程序范例。
calculatorHolder.java-holder类是一个专门化类,是为了必要经由过程援用来传送参数的恣意数据范例而天生的。这个示例中将不利用holder类,但我们将会在今后的栏目中常常见到它。
calculatorPOA.java-skeleton类为CORBA功效供应了哀求-呼应探测的一年夜部分。天生calculatorPOA.java,是由于缺省体例下的完成是基于承继的,假如我们选择基于托付的完成体例,输入就会纷歧样。这些主题将在今后的栏目中具体先容。
_calculatorStub.java-望文生义,这是一个stub类。您的客户机将必要这个类来举行事情。
服务器
如今天生的文件必需在服务器上入手下手事情,用这个服务器完成我们的接口。所幸的是,年夜部分探测是合适我们的请求的,但别乐意得太早--另有很多事情要做;就是说,一切这些文件都必需用在准确的中央。
让我们从add()办法的完成入手下手。(您能够下载完全的SimpleCalcSvr.java文件。)
清单3.SimpleCalcSvr.java--add()办法SimpleCalcServantextendscalculatorPOA{
publicintadd(intx,inty){
returnx+y;
}
}
请注重,我们的完成类扩大了已天生的类calculatorPOA。从客户机发来一个哀求时,该哀求经由过程ORB进进skeleton,skeleton终极将挪用SimpleCalcServant,来完成哀求并启动呼应。我们的接口很复杂,以是我们的完成也很复杂。
服务器其他部分的完成,触及怎样环绕这个接话柄现来设置CORBA系统布局,因为可移植性和天真性方面的缘故原由,很多这些挪用要按CORBA标准实行。
我们必要完成的第一项义务是,具体申明要利用哪个ORB,然后予以初始化。上面的代码(文件SimpleCalcSvr.java的第18行到第29行)处置此义务:
清单4.SimpleCalcSvr.java--初始化ORBjava.util.Propertiesprops=System.getProperties();
props.put("org.omg.CORBA.ORBClass",
"com.ooc.CORBA.ORG");
props.put("org.omg.CORBA.ORBSingletonClass",
"com.ooc.CORBA.ORBSingleton");
org.omg.CORBA.ORBorb=null;
//初始化ORB
orb=org.omg.CORBA.ORB.init(args,props);
初始化ORB时,必要正确地告知它哪个类将用作ORBClass,哪个类将用作ORBSingleton类。我们的完成将不思索这些,但一切相干的探测则都将思索这些。正如我后面所说的,这类情形下,我利用的是ObjectOrientedConcepts,Inc.的OrbacusORB,而OOC类在那两个props.put()挪用中已给出。一旦填进了属性,props就只作为一个参数传送给ORB.init()办法。实践情形大概不是如许;假如我们要把这个服务器移到另外一个ORB,不但愿为服务重视新编码。以是,在幻想情形下,我们宁肯改动一个设置文件,使之指向另外一个ORB类,然后间接从头启动。
如今,ORB已到位并已初始化,而且完成也已到位,只是还没有创立,此时,必要为完成创立一个完美的保存地址,而这可不像听起来那末简单,在一个散布式情况中,各个完成请求的情况大概略有分歧。能够付与完成很多特性。完成既能够是单线程的,也能够是多线程的;既能够是具有高度可伸缩性的对象池,也能够是单位素。这很多分歧的服务器特性已发生了可移植对象适配器(POA)。POA使我们能够创立完美的情况,供我们的完成在个中驻留。一切切合2.3标准的ORB城市有一个根POA,一切别的POA都是从根POA创立的。在这个复杂示例中,我已将完成公用的代码分化为它本人的办法runcalc()。
为完成创立一个情况将是我们的第一项义务,以是必需设置一个POA。原本,CORBA服务器利用基础对象适配器(BOA),可是每一个供给商的BOA都纷歧样,在最新版本的CORBA标准中,POA已完整代替了BOA。
清单5.SimpleCalcSvr.java--设置POA//从一直存在的rootPOA
//设置可移植对象适配器
org.omg.PortableServer.POArootPOA=
org.omg.PortableServer.POAHelper.narrow(
orb.resolve_initial_references("RootPOA"));
org.omg.PortableServer.POAManagermanager=
rootPOA.the_POAManager();
从题目和界说能够看出,这是一个复杂的示例。利用根POA而不创立新的POA,将使事变变得复杂。POA办理器是一种封装了POA处置形态的对象,以是,我们利用POA办理器,将发给servant的哀求列队。
还必要实例化完成:
清单6.SimpleCalcSvr.java--实例化完成//创立盘算程序接口的servant
SimpleCalcServantcalcSvt=newSimpleCalcServant();
calculatorcalc=calcSvt._this(orb);
依照CORBA2.3标准,一切skeleton均供应一个_this()办法,该办法使servant能失掉方针CORBA对象的对象援用,servant恰是用方针CORBA对象来与这些哀求相干联的。
完成完成的实例化今后,就必需把机制放到得当的地位,以便客户性能够找到它们。有很多分歧的办法和服务可用来找到满意接口哀求的对象。CORBAService界说NamingService和TraderServices,来专门匡助客户机查找对象,以处置哀求。也能够经由过程办法挪用来传送对象。
在这个示例中,我们将利用一切办法中最刀切斧砍的一种―将对象援用写进一个文件,该文件将由客户机拔取。关于一切的ORB来讲,创立一个对象援用的字符串暗示,大概反过去,创立由字符串到对象的援用,都是必备的功效。
清单7.SimpleCalcSvr.java--编写对象援用//将对象援用写进一个文件
PrintWriterrefstr=newPrintWriter(
newFileWriter("calcref.ior"));
refstr.println(orb.object_to_string(calc));
refstr.close();
最初要做的一件事,就是激活POA,使客户机哀求入手下手列队,并强迫服务器输出其事务轮回,以吸收这些传进的哀求。
清单8.SimpleCalcSvr.java--激活POA//使完成成为可用
manager.activate();
System.out.println("SimpleCalcSvrisrunning!");
orb.run();
客户机
假如您思索一下正在产生的事务的机制,就会分明客户机和服务器实践上恰是互为映像的。客户机将一切的参数打包以创立一个哀求,然后以它本人的体例来发送这个哀求。服务器只是将哀求中的参数解包,实行运算,将前往值和输入参数打包,然后向客户机发还呼应。客户机则将前往值和输入参数解包,然后持续处置。如许,客户机打包甚么,服务器就解包甚么,反之亦然。
这意味着您将会看到客户机和服务用具有类似的布局。客户机还必需创立并初始化一个ORB。它能够是我们正在利用的ORB,也能够是另外一个供给商供应的ORB;可是,不克不及是恣意的ORB,而应当是撑持IIOP的ORB,IIOP是由对象办理团体(OMG)界说的、基于TCP/IP的互操纵性协定。假如您的ORB对照旧,那末请当心,它大概没法与别的ORB通话。
起首,我们以不异的体例创立ORB,就像创立服务器一样。(您能够下载完全的SimpleCalcClient.java文件。)
清单9.SimpleCalcClient.java--初始化ORBjava.util.Propertiesprops=System.getProperties();
props.put("org.omg.CORBA.ORBClass",
"com.ooc.CORBA.ORG");
props.put("org.omg.CORBA.ORBSingletonClass",
"com.ooc.CORBA.ORBSingleton");
org.omg.CORBA.ORBorb=null;
//初始化ORB
orb=ORB.init(args,props);
看起来眼生?应当是如许,它看起来与服务器完整一样。如今,客户机已毗连到了一个ORB之上,但我们的方针是挪用一个服务,而这个服务是在体系中其余中央供应的,必要找到能呼应哀求的对象。在这个示例中,这意味着要从创立于服务器上的文件中猎取一个对象援用。为了找到盘算程序服务器,必要获得存储在这个文件中的对象援用的字符串版本,然后把它转换成对象援用,经由过程这个对象援用就能够举行挪用了。
清单10.SimpleCalcClient.java--猎取对象援用System.out.println("Gettingreferencefromstring...");
BufferedReaderin=newBufferedReader(
newFileReader("calcref.ior"));
Stringior=in.readLine();
in.close();
calculatorcalc=calculatorHelper.narrow(
orb.string_to_object(ior));
请注重,这里利用了由IDL-to-Java编译器天生的calculatorHelper类。calcref.ior文件含有一个对象援用,而不是含有盘算程序援用。calculatorHelper类有一个narrow办法,可用来将笼统范例会合到特定的盘算程序范例。
细心看一看盘算程序calc,它暗示盘算机空间中别的某个中央的一个服务器。最初必需做的一件事,就是挪用calc上的办法add()。
清单11.SimpleCalcClient.java--挪用add()System.out.println(calc.add(2,3));
结论
已会商了良多内容,不外请想想,都学到了甚么。我们的客户机与服务器是完整断绝的,客户机不晓得服务器在甚么样的硬件上运转,利用的是甚么操纵体系,它是用甚么言语编写的,它是否是多线程的,另有,它位于那边―是在近邻,仍是间隔半个地球之远。它只晓得一点,即假如它挪用calc中的add(),就会失掉能够期望的呼应。
供应服务的情况全都是如许,德律风或电力公司也是云云。当您拿起德律风的时分,您所希冀的是听到拔号音,然后您的呼唤能流通毗连,您其实不在意德律风是经由过程光缆传输的仍是经由过程卫星转发的,一样的情形在信息家产中也正在成为实际。多亏有了OMG和这个基础布局,我们才得以加进这个既复杂而又十分有压服力的例子。
下个月,我们将略微深切地开掘一下,看一看产生在外表征象之下的IIOP的奇妙力气。
先谈谈我对java的一些认识。我选择java,是因为他语法简单,功能强大,从web,到桌面,到嵌入式,无所不能。但当我进一步了解了java后,感叹,java原来也有许多缺点。 |
|