




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、利用语言与平台特性改良RMI分布计算框架论文导读:RMI(Remote Method Invocation)是Sun设计的基于Java的轻量级分布对象计算解决方案。RMI不但在本身的体系结构设计上非常优秀,它还利用和继承了Java平台的假设干得天独厚的特性,譬如平台无关性、分布垃圾回收、平安性、代码移动性、类动态加载等等。关键词:Java,RMI,Stub/Skelton,Serialization,DynamicProxy,DynamicClassLoading1引言至今为止,几乎所有的分布式计算框架都采用了Stub/Skelton设计,如OMG的CORBA、MicroSoft的DCOM、S
2、un MicroSystems的RMI,以通明化远程调用。动作序列一般如下:客户端的远程调用;代理给Stub,Stub与客户端分布计算引擎交互,客户端的引擎与效劳器端的引擎通信,传递调用信息,效劳器端的分布计算引擎与Skeleton交互,Skeleon将远程调用转发给远程对象实施。然后,再沿相反的路径传回结果。如图1所示.图1RMI(Remote Method Invocation)是Sun设计的基于Java的轻量级分布对象计算解决方案。RMI不但在本身的体系结构设计上非常优秀,它还利用和继承了Java平台的假设干得天独厚的特性,譬如平台无关性、分布垃圾回收、平安性、代码移动性、类动态加载等等
3、。它是EJB和JINI的分布特性支持技术。2RMI的编程模型和本质2.1RMI的编程模型public interface HelloWorld extendsRemotepublic StringreturnGreeting(String param) throws RemoteException;这个接口定义了远程对象行为,RMI标准规定远程接口需要直接或间接扩展Remote接口并且方法签名需要抛出RemoteException异常。public class HelloWorldImpl extends UnicastRemoteObject implements HelloWorldpub
4、licHelloWorldImpl() throws RemoteException super(); public StringreturnGreeting(String param) return Hello;+param;/* */HelloWorldImpl hwi =new HelloWorldImpl();Naming.bind(HelloWorld;,hwi);/* */* */System.setSecurityManager(new RMISecurityManager();HelloWorld hw = (HelloWorld)Naming.lookup(rmi:/loca
5、lhost/HelloWorld;);/* */javacHelloWorld.java HelloWorldImpl.java Main.java Client.java产生文件HelloWorld.class、HelloWorldImpl.class、Main.class、Client.class、HelloWorldImpl_Stub.class、HelloWorldImpl_Skel.class。效劳器端首先配置文件HelloWorld.class、HelloWorldImpl.class、Main.class、HelloWorldImpl_Stub.class、HelloWorldI
6、mpl_Skel.class文件,然后执行java rimregistryjava Main客户端首先配置文件HelloWorld.class、HelloWorldImpl_Stub.class然后执行java Client2.2RMI的本质这里我们以上面表达编程模型时使用的实例来描述追踪RMI的运作,从而探出本质。HelloWorldImpl hwi = newHelloWorldImpl();Naming.bind(HelloWorld;,hwi);上面两句,实现了远程对象的导出(export),并将之与名字HelloWorld绑定。这里我们需要深入探讨,直入本质,因为我们的改良的一局部就
7、是在这里着手的。因为HelloWorldImpl继承了UnicastRemoteObject,而UnicastRemoteObject在构造函数中通过exportOjbet将对象导出到特定端口,以使得对象可被远程引用。ExportObject将远程对象置入一个ObjectTable中,并且加载HelloWorldImpl_Stub,并且将Stub与名字绑定。而不是一般认为的远程对象。这样作的目的主要是考虑到远程对象作为参数或返回值的时候,只能传入Stub,而不能移动远程对象实体,满足分布式环境计算的需要。HelloWorld hw =(HelloWorld)Naming.lookup(rmi:
8、/localhost/HelloWorld;)解析。自然,在使用远程对象之前,需要获得远程对象引用。这一步是通过registry来实现的,registry事实上,是rmi专用的名字效劳工具。它也是远程对象,默认运作在2021端口,也可以使用LocateRegistry.createRegistry()在特定端口导出它。客户端的lookup操作会首先取得效劳器端registry的远程引用,然后使用远程引用再查询HelloWorldImpl,从效劳器端获得的远程引用事实上是一个Stub,所以我们上面的hw事实上是代表Stub的RemoteObject。到此为止,我们已经取得了远程对象的远程引用。上
9、面已经根本将核心步骤讲述了。可以参看图2。图23Java语言的几种特性3.1 Java的Serialization特性Serialization特性是在JDK 1.1中增添的,一个对象只要implementsSerializable,就可以实现;持久化;。持久化能力表示对象可以写入介质,然后再从介质中读出并在内存中恢复原状态的能力。对象的这种能力对于网络应用非常的重要。因为它可以支持对象在网络传输过程中,屏蔽系统的差异。我们关注的是接口中的ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException方法,它是用于在对
10、象反序列化时,如果你希望用其它的对象来替代原先的对象,你就可以在这里实施。3.2 Java的Dynamic ClassLoading特性3.3Java的Dynamic Proxy特性Dynamic Proxy特性是在JDK 1.3中添加的,它遵循Proxy模式的思想。一个DynamciProxy可代理;一组interface的实现,并且将实际方法调用代理给一个InvocationHandler实施。通过这种特性,我们可以方便的实现很多经典的应用,如为一组对象提供一个入口,从而实现在不改变类设计的情况下增加新的功能或者实现拦截器等等。4利用上述Java特性改良RMI模型实施就目前来说,RMI解决
11、方案一般作为企业分布架构的根底。当然,企业级应用中,平安性、事务性、系统日记等性征都是很必要的,那么我们就设想是否可以在RMI层实施这些特性,从而建立设计更优秀、功能更强大、扩展性更强、维护更方便的企业级系统。经过探索,利用上述Java特性我们实现了这一设想,设计出Interceptor(拦截器)RMI框架。图3图3需要解决的核心问题和相应的解决方案如下:1.为了客户端从效劳器端下载Stub并能够安装拦截器,我们需要替换掉效劳器端默认的类加载器,用DynamicClassLoader替代。public classDynamicClassLoader extends URLClassLoader
12、/* */protectedClass findClass(String name) throws ClassNotFoundExceptionif(name.endsWith(_Stub)name = name.substring(0,name.length()-5);Class cl = loadClass(name);currentClass.set(cl.getInterfaces();returnDynamicRemoteStub.class;else returnsuper.findClass(name); 这样,我们在加载远程对象的时候,可以使用自己的ClassLoader,来动
13、态替换Stub。2. 那么DynamicRemoteStub是什么呢?public class DynamicRemoteStub extends RemoteStub/* */ObjectreadResolve() throws ObjectStreamExceptionif(cl = null) return this;DynamicStubHandlerstubHandler = new DynamicStubHandler();Objectproxy = Proxy.newProxyInstance(cl.getClassLoader(),new Class cl ,stubHandl
14、er);stubHandler.setProxy(this);cl= null;returnproxy;这里我们需要注意的是readResolve,它是在对象序列化的时候调用,实施一定的方法,用其它的对象来代替原来解序列的对象。我们在这里实施这一行为返回代理,在于为客户端添加拦截器。3. 那么代理的处理者InvocationHandler是什么?就是DynamicStubHandler:public classDynamicStubHandler implements/* */InvocationHandler implementationpublicObject invoke(Object
15、proxy,Method method,Object args) throws Throwablereturnstub.getRef().invoke(stub, method, args, getHash(method);/* */我们可以看到,returnstub.getRef().invoke(stub, method, args,getHash(method),通过它,客户端在经过任意个拦击器调用后,最后实施将远程对象的调用。4. 效劳器端的拦截器实施。HelloWorld hw = newHelloWorldImpl();UnicastRemoteObject.exportObjec
16、t(hw);new Class HelloWorld.class ,new LogProxy(hw);UnicastRemoteObject.exportObject(hw);/* */hw = (HelloWorld) Proxy.newProxyInstance(hw.getClass().getClassLoader(),new Class HelloWorld.class ,new ReconnectProxy(server, HelloWorld.NAME);hw = (HelloWorld)Proxy.newProxyInstance(HelloWorld.getClass().g
17、etClassLoader(),new Class HelloWorld.class ,new PerformanceProxy(hw);Naming.bind(HellotWorld.NAME, server);上面仅为例如,我们在打算在效劳器端添加一个LogProxy,在客户端添加ReconnectProxy和PerformanceProxy。决定到底是否是客户端拦截器的是是否使用UnicastRemoteObject.exportObject导出远程对象,因为RMI标准标准没有将Stub与名字绑定的对象,在远程引用的时候,直接将远程对象自身序列化到客户端,而不是它的Stub,这里实施了一
18、个Trick。5.我们可以看到上面使用了大量的拦截器。事实上,拦截器主要的功能就是实施特殊应需求,并且传递调用。最根本的要求,它们需要继承InvocationHandler,并且implements Serializable 。LogProxy例如:/* */public Object invoke(Objectproxy,Method method,Object args) throws Throwable/*省略:具体的LogProxy拦截器行为在这里实施*/tryreturn method.invoke(next, args); catch(InvocationTargetException e)throw e.getTargetException();/* 省略:next 相关的操作 */ 5结语:改良的意义和应用RMI作为目前最为优秀的分布计算框架之一,应用非常广泛,特别是企业级的系统根底架构。而企业级架构中事务特性、日记、性能评价、设计上优秀的扩展性、网络范围管理的便利等等都是很必要的。Interceptor-RMI框架正是为了适应了这一需求而设计的。它为企业分布计算根底架构提供了一个优秀的参考。参考文献【1】SunMicroSystems,inc. RMI Specification. Sun MicroSystems,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 轨道交通设备租赁合同
- 2025年度酒店客房地毯清洗及更换承包合同
- 电子制餐安全生产培训
- 二零二五年度旅游园区企业入驻共同发展协议
- 二零二五年度环保设备租赁及环保服务合同
- 二零二五年度跨境资金转入监管协议书
- 二零二五年度酒店退场员工安置与补偿协议
- 二零二五年度金融居间保密合作协议
- 二零二五年度亲子亲子关系咨询机构与家长孩子亲子关系和谐协议
- 二零二五年度房屋买卖合同解除通知及购房资格核实协议
- 常见八种疾病
- 胶粘剂基础知识及产品详解(课堂PPT)
- 完整版三措两案范文
- 计算书平原微丘区二级公路设计
- 铁路总公司近期处理的七起突出质量问题的通报
- 常用洪水预报模型介绍
- 援外项目钢结构运输包装作业指导书(共13页)
- 髋关节置换术男性患者留置尿管最佳时机探析和对策
- [爆笑小品校园剧本7人]爆笑小品校园剧本
- 同步带轮设计
- 服装工厂评估资料样本
评论
0/150
提交评论