日期:2011-03-22 16:16:00 来源:本站整理
一个例子(CORBA)[Java编程]
本文“一个例子(CORBA)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这儿显示的代码大概并不细致,因为差别的ORB有差别的办法来拜候CORBA服务,所以无论什么例子都要取决于具体的厂商(下例利用了JavaIDL,这是Sun公司的一个免费产品.它配套供应了一个简化版本的ORB、一个命名服务以及一个“IDL→Java”编译器).除此之外,由于Java仍处在发展早期,所以在差别的Java/CORBA产品里并非包含了全部CORBA特点.
我们但愿实现一个服务器,令其在一些机械上运行,其他机械能向它查询精确的时间.我们也但愿实现一个客户,令其恳求精确的时间.在这种情形下,我们让两个程序都用Java实现.但在实际利用中,常常辨别采取差别的语言.
1. 编写IDL源码
第一步是为供应的服务编写一个IDL描写.这普通是由服务器程序员完成的.随后,程序员便可用任何语言实现服务器,只需那种语言里存在着一个CORBA IDL编译器.
IDL文件已分发给客户端的程序员,并成为两种语言间的桥梁.
下面这个例子展示了时间服务器的IDL描写情形:
module RemoteTime { interface ExactTime { string getTime(); }; };
这是对RemoteTime命名空间内的ExactTime接口的一个声明.该接口由单独一个办法构成,它以字串格局返回当前时间.
2. 成立根干
第二步是编译IDL,成立Java根干代码.我们将操纵这些代码实现客户和服务器.与JavaIDL产品配套供应的工具是idltojava:
idltojava -fserver -fclient RemoteTime.idl
此中两个标志奉告idltojava同时为根和干生成代码.idltojava会生成一个Java包,它在IDL模块、RemoteTime以及生成的Java文件置入RemoteTime子目录后命名._ExactTimeImplBase.java代表我们用于实现服务器对象的“干”;而_ExactTimeStub.java将用于客户.在ExactTime.java中,用Java方法表示了IDL接口.此外还包含了用到的其他支持文件,比方用于简化拜候命名服务的文件.
3. 实现服务器和客户
大家在下面看到的是服务器端利用的代码.服务器对象是在ExactTimeServer类里实现的.RemoteTimeServer这个利用的作用是:成立一个服务器对象,通过ORB为其注册,指定对象引用时采取的名称,然后“安静”地等候客户发出恳求.
import RemoteTime.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import java.util.*; import java.text.*; // Server object implementation class ExactTimeServer extends _ExactTimeImplBase{ public String getTime(){ return DateFormat. getTimeInstance(DateFormat.FULL). format(new Date( System.currentTimeMillis())); } } // Remote application implementation public class RemoteTimeServer { public static void main(String args[]) { try { // ORB creation and initialization: ORB orb = ORB.init(args, null); // Create the server object and register it: ExactTimeServer timeServerObjRef = new ExactTimeServer(); orb.connect(timeServerObjRef); // Get the root naming context: org.omg.CORBA.Object objRef = orb.resolve_initial_references( "NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); // Assign a string name to the // object reference (binding): NameComponent nc = new NameComponent("ExactTime", ""); NameComponent path[] = {nc}; ncRef.rebind(path, timeServerObjRef); // Wait for client requests: java.lang.Object sync = new java.lang.Object(); synchronized(sync){ sync.wait(); } } catch (Exception e) { System.out.println( "Remote Time server error: " + e); e.printStackTrace(System.out); } } }
正如大家看到的那样,服务器对象的实现是非常简单的;它是一个普通的Java类,从IDL编译器生成的“干”代码中担当而来.但在与ORB以及其他CORBA服务举行接洽的时刻,情形却变得略微有些复杂.
4. 一些CORBA服务
这里要简单介绍一下JavaIDL相关代码所做的工作(注意暂时忽视了CORBA代码与差别厂商有关这一事实).main()的第一行代码用于启动ORB.并且理所当然,这恰是服务器对象需求同它举行沟通的缘由.就在ORB初始化今后,紧接着就成立了一个服务器对象.实际上,它正式名称应当是“短时间服务对象”:从客户那边接纳恳求,“生存时间”与成立它的进程是相同的.成立好短时间服务对象后,就会通过ORB对其举行注册.这意味着ORB已知道它的存在,可将恳求转发给它.
到目前为止,我们拥有的全部东西就是一个timeServerObjRef——只有在当前服务器进程里才有效的一个对象引用.下一步是为这个服务对象分配一个字串情势的名字.客户会按照那个名字探求服务对象.我们通过命名服务(Naming Service)完成这一操作.首先,我们需求对命名服务的一个对象引用.通过调用resolve_initial_references(),可得到对命名服务的字串式对象引用(在JavaIDL中是“NameService”),并将这个引用返回.这是对采取narrow()办法的一个特定NamingContext引用的模子.我们目前可开始利用命名服务了.
为了将服务对象同一个字串情势的对象引用绑定在一同,我们首先成立一个NameComponent对象,用“ExactTime”举行初始化.“ExactTime”是我们想用于绑定服务对象的名称字串.随后利用rebind()办法,这是受限于对象引用的字串化引用.我们用rebind()分配一个引用——即便它已经存在.而假如引用已经存在,那么bind()会造成一个非常.在CORBA中,名称由一系列NameContext构成——这就是我们为什么要用一个数组将名称与对象引用绑定起来的缘由.
服务对象最好预备好由客户利用.此时,服务器进程会进入一种等候状况.一样地,由于它是一种“短时间服务”,所以生存时间要受服务器进程的限制.JavaIDL目前还没有供应对“长期对象”(只要成立它们的进程保持运行状况,对象就会一向存在下去)的支持.
目前,我们已对服务器代码的工作有了一定的熟习.接下来看看客户代码:
import RemoteTime.*; import org.omg.CosNaming.*; import org.omg.CORBA.*; public class RemoteTimeClient { public static void main(String args[]) { try { // ORB creation and initialization: ORB orb = ORB.init(args, null); // Get the root naming context: org.omg.CORBA.Object objRef = orb.resolve_initial_references( "NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); // Get (resolve) the stringified object // reference for the time server: NameComponent nc = new NameComponent("ExactTime", ""); NameComponent path[] = {nc}; ExactTime timeObjRef = ExactTimeHelper.narrow( ncRef.resolve(path)); // Make requests to the server object: String exactTime = timeObjRef.getTime(); System.out.println(exactTime); } catch (Exception e) { System.out.println( "Remote Time server error: " + e); e.printStackTrace(System.out); } } }
前几行所做的工作与它们在服务器进程里是一样的:ORB得到初始化,并解析出对命名服务的一个引用.
接下来,我们需求用到服务对象的一个对象引用,所以将字串情势的对象引用直接传送给resolve()办法,并用narrow()办法将后果造型到ExactTime接口引用里.最后调用getTime().
5. 激活名称服务进程
目前,我们已辨别得到了一个服务器和一个客户利用,它们已作好彼此间举行沟通的预备.大家知道二者都需求操纵命名服务绑定和解析字串情势的对象引用.在运行服务大概客户之前,我们必须启动命名服务进程.在JavaIDL中,命名服务属于一个Java利用,是随产品配套供应的.但它大概与其他产品有所差别.JavaIDL命名服务在JVM的一个实例里运行,并(默许)监督网络端口900.
6. 激活服务器与客户
目前,我们已预备好启动服务器和客户利用(之所以按这一次序,是由于服务器的存在是“短时间”的).若各个方面都设置无误,那么得到的就是在客户掌握台窗口内的一行输出文字,提醒我们当前的时间是多少.当然,这一后果本身并没有什么令人高兴的.但应注意一个问题:即便都处在同一台机械上,客户和服务器利用仍旧运行于差别的虚拟机内.它们之间的通信是通过一个基本的集成层举行的——即ORB与命名服务的集成.
这只是一个简单的例子,面向非网络环境计划.但普通将ORB配置成“与位置无关”.若服务器与客户辨别位于差别的机械上,那么ORB可用一个名为“安装库”(Implementation Repository)的组件解析出远程字串式引用.固然“安装库”属于CORBA的一部份,但它几近没有具体的规格,所以各厂商的实现方法是不尽相同的.
正如大家看到的那样,CORBA还有很多方面的问题未在这儿举行具体报告.但通过以上的介绍,应已对其有一个基本的熟习.若想得到CORBA更具体的资料,最传真的起点莫过于OMB Web站点,地址是http://www.omg.org.这个地方供应了丰富的文档资料、白页、程序以及对其他CORBA资源和产品的链接.
以上是“一个例子(CORBA)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:Java程序片和CORBA
- ·下一篇文章:什么是corba
- ·中查找“一个例子(CORBA)”更多相关内容
- ·中查找“一个例子(CORBA)”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论