单一JAVA虚拟机的执行
在《International Conference on the Principles and Practice of Programming in Java》中我们介绍了展示如何使用动态代理支持开放执行方式和代码重用。这里我们回顾这些通过触发事件使对象属性变为活动的JAVABEAN,并且展示它的实际用途的例子。活动的JAVABEAN当对象状态发生改变时通过触发事件来进行,比如,通过调用SET方法。JAVABEAN通过一个叫做PropertyChangeEvent的类型来支持监听接口PropertyChangeListener以及称为PropertyChangeSupport的支持类。JAVABEAN活动机制能够以MVC模式实现,View在模式中以监听者的姿态存在,通过动态代理能够实现信息监听并触发事件。当与传统方式(比如继承和聚合)进行比较时代理的执行有很多优势,比如能够用MVC模式创建GUI,也就是:
图5
图6
图7
从基础类中分离出触发不同信息的监听者
规定属性执行事件触发机制
使用继承和聚合来实现MVC模式请求事件触发意味着依靠GUI在相应的JAVABEAN类执行,并且潜在更高的耦合和更高的测试和文护花费。
图5展示一个IPoint类的Point对象(表示M)能够依附在BeanProxy类型的META类中,并指派独立的Demo类型的listener对象(表示V)。捆绑函数createProxy()在图6中展示。
除了InvocationHandler之外,BeanProxy也同样实现IPropertyChangeSupport接口实现增加和移除监听者并获取SET方法之后触发特性改变事件。图7实现获取任何基础层对象状态改变。在调用基础对象的SET方法时,代理获得目标对象域的旧值,接着触发调用SET方法获得新值的事件。
我们注意到如果支持GUI独立应用的话,BeanProxyFactory 和 BeanProxy 是独立执行并且从而能够被作为library类。映像和多态允许普通代码的执行。JAVA的动态代理机制在运行时提供调用映像代码的方法。
分布式计算机系统中的开放式体系结构
图4提供的体系结构适合面向对象结构来实现客户应用程序代码分离、独立并且允许运行时以普通方式应用。从分布式系统角度看,描述了在单一JAVA虚拟机中的单一应用。代理代码必须下载到客户端并进行安装,这样才能使开放式体系结构允许用户定制默认执行方式。
在分布式环境中,代码必须被多个拥有各自JAVA虚拟机的客户端接受。基础层和META层的连接必须以支持在基础层不同的机器并发使用META对象的行为。客户端/服务器结构对通讯协议有规范要求,有多种协议可供选择,常见的有JRMP,我们比较熟悉的RMI协议,联合CORBA的IIOP协议,以及HTTP协议。
在这里将单一JAVA虚拟机开放体系结构扩张到客户/服务器体系结构,通过使用多台机器的多个JAVA虚拟机。它提供了代码重用,为完成这个目标,我们首先考虑RMI协议并且使用相应的技术,比如java环境jdk1.1.x。其次,看一下CORBA执行使用的是完全功能的ORB支持JAVA平台。最后我们考虑HTTP协议来建造一个JAVA SERVLET使用可用的SERVLET 公共程序接口。
在我们对不同执行的讨论中我们忽视了网络安全、存储控制、数据加密以及防火墙的研究。
图4是客户端/服务器体系结构在基础层连接多个客户端,在META层连接多个服务器应用程序(见图8)
图8
使用JRMP作为通讯协议,客户端通过在基础层App.1,Appp. 2, ..., and App. N和META层服务器应用程序实现TCP/IP协议和树状层次RMI体系结构,RMI系统提供了描述调用远程对象来定制它的行为。远程方法调用在数据链路层中定义并且支持RMI。JAVA虚拟机的客户端之间在传输层通过TCP/IP协议实现服务。
在IIOP协议中,客户端和服务器之间的通讯通过相同的方式来实现。在建立连接之后,根部发送对象委任书和参数给主要代码连接目标文件对象的执行。主要代码转换成特殊格式后被调用给目标对象,任何结果和意见在ORB上通过相同路径返回,ORB在传输层下表达。
SERVLET随着请求/应答模式在客户端发送HTTP请求消息到服务器并且服务器将返回应答。服务通常支持具有中间层的三层体系结构,通过在客户端和数据源之间控制请求和应答。App.1,App.2,…, and App.n通过请求到达服务器,在SERVLET下运行并利用HTTP协议接受应答,返回给远程对象。
图13
首先,我们必须转向通讯接口并且进行定义。在图13中有远程接口。这个接口必须在客户端和服务器端都被知道。
第二,我们必须使用适配器模式,转移运算规则。图14为BeanProxyFactory 在BeanProxyFactoryWrapper对象中的限制
图14
图15
拥有已定制的在服务器端和普通通讯接口的一般服务,我们致力于思考一个在基础层包含Point对象和client对象作为监听者的简单应用。Point对象的属性应该被定制成为活动的JAVABEAN。Point类实现连接的被定义了方法和属性的IPoint接口,图15展示了客户端listen类(8-11行执行PropertyChangeListener)。客户端请求通过安装安全管理(14行)。作为一个服务器,安全管理是必需的,RMI系统应该在客户端下载代码并安装。15行为基础类的建立,17-18行为客户端构造一个IBeanProxyFactory远程对象,首命令行的值args[0],是IBeanProxyFactory对象在远程主机运行的名字。args[1]指定接受远程对象请求的端口。客户端使用lookup()方法访问已注册的主机(19行)。Remote对象帮助,代理对象的建立(21行)。建立一个代理,基础对象通过附带参数和监听接口一起调用一个代理SET方法,引起相应对象请求新的值和触发事件(PropertyChangeEvent)。以这种方式,基础对象行为的属性,活动的JAVABEAN。
客户端定义一个安全策略并且使用一个WEB服务器来下载RMI系统所需要的类,客户端可提供一个URL路径,并指出可用的类。在我们的例子中,这里类是Point, IPoint 和BeanProxyClient。
基于RMI(远程方法调用)的系统(略)
CORBA(公用对象请求代理[调度]程序体系结构)的实现
在公用对象请求代理[调度]程序体系结构中,客户应用程序和服务器应用程序在ORB上相互影响。使用对象请求代理[调度]程序,传送一个呼叫处理方法请求到服务器端,服务器端通过相同的路径将结果返回给客户。
我们看一下一个定义并实现远程方法调用程序的ProxyFactory函数。而且,我们使用JAVA 2平台IDL设计模型,即JAVA IDL,由JAVA公用对象请求代理[调度]程序体系结构 ORB和idlj编译器组成。编译器绘制JAVA封装对象管理组接口定义语言图视。该模型使分布式的,使用WEB,激活的JAVA 应用软件并使用工业标准和HOP协议来调用远程网络通讯。
随着IDL程序设计模型,我们使用IDL定义远程接口,接着使用idlj编译器编译接口。编译器生成接口的JAVA译本。也就是来代码文件的根和分支,使我们能够应用到ORB里去。在IDL接口使用idlj类似于调用远程方法调用系统在远程目标执行的rmic工具,例如BeanProxyFactoryWrapper的上级菜单部分。因为服务器供应服务重用片段,它们执行一般行为并且和应用规范无关。IDL接口被任命为服务在服务器端的实现,并通过ORB传递给客户端,通过普通参数映像服务类别并返回与客户端程序无关的类型。IDL提供适当的类型,比如允许我们表示
图16
服务类型。JAVA的org.omg.CORBA.Any绘制任意类型并且绘制一对由omg.org.CORBA.TypeCode和一个变量组成的对象。我们注意到org.omg.CORBA.Any提供了允许插入和提取TypeCode和包含值的对象。
图16展示了普通IDL接口在连续的伪代码中更多功能。第一个内部参数obj,属于代理描述的类型。在代理服务器,在服务器端实现了提供并适宜定制目标行为函数结构。第二个参数可以是任何类型并且可随意增加。函数返回值也是任何类型的。ProxyObject模块是使用相同的包绘制到根和枝干需要在通讯时被放置在ORB上的Java 包。
图17
一次JAVA的IDL接口ProxyFactoryWrapper的执行在图17中显示。ProxyFactoryWrapperPOA类的扩展(15行)以及提供接口中每个操作的方法。ProxyFactory类型的对象被作为一个集合体来使用(行6)并且在构造(8-10)时已被初始化。在createProxy()方法中,对象org.omg.CORBA.Any参数的大小被作为java.lang.Objects首先被萃取(13-14)。返回的java.lang.Objects类型的对象使用当前ORB建立当前分支关联。所萃取的对象作为方法的参数代表集合体获得一个代理对象作为返回值(18行)代理对象在后面对象返回前插入返回对象(19行)。调用ProxyFactory与图14中执行RMI远程方法对象BeanProxyFactoryWrapper相似。
ProxyFactoryWrapperPOA分支的产生是通过idlj 编译器从<InterfaceName>POA中获得一个名字作为IDL/JAVA绘制格式的一部分。所有分支类通过应用idlj编译器允许我们的连接ORB运行系统和提供信号编辑和非信号编辑程序的应用请求。有一种可选择的方法是具有遗传实现风格的带分支类的实际应用类的联合对象,调用委托或者结带方法。通过使用结带方法,ProxyFactoryWrapperImpl不能扩展ProxyFactoryWrapperPOA,但是它能够实现ProxyFactoryWrapperOperations和delegates方法,分支类ProxyFactoryWrapperPOATie产生了必需的类来执行结带方法,当应用idlj工具时来完成使用适当的选项。
便携式的对象适配器POA是造成测试和潜在操作实现的ORB的结构组成。
图18展示了服务器应用程序类的典型实现。在 main方法中,类初始化ORB(18行),建立执行对象theProxylmpl(12,13行),并提交给客户使用公用对象请求代理[调度]程序体系结构命名服务Nameservice (9-20行)执行对象可以是唯一命名(21行),使得客户端能够唯一识别。在给予 对象一个名字之前,它首先必须通过参考POA被翻译为CORBA对象(15行)。对象适配器通过根POA获得,并且结果是缩小为POA类型(10行)。对象适配器是通过POAManager来允许派发引入请求(23行)。最后,run()在ORB对象上调用来允许main等待和监听即将到来的请求(24行)。
图18
图19展示了客户端实现类。在服务器,客户请求首先在ORB上被初始化并且接着使用CORBA的命名服务器来决定涉及的对象(9-15行)。涉及者是org.omg.CORBA.Object类型并且缩小为具有ProxyFactoryWrapperHelper帮助的适当的JAVA接口类型(16行)。ProxyFactoryWrapper接口通过使用idlj工具产生为图16的 idlj-文件.idlj工具绘制了IDL接口使用相同名字和相同方法设置进入JAVA接口。获得具有合适对象接口的涉及对象,我们能够调用这类对象,它在服务器端定义,如createProxy(Any, Any)。为了调用这些方法,我们使用ORB建立两个org.omg.CORBA.Any对象并且插入基于对象的适当的连续的参数(19-31行)。Invocation方法的结构能够被从任意类型的方法的返回中萃取,使用extract_Value ( )和type-casting(32,33行)。在我们的例子中,java.lang.reflect.InvocationHandler类型的结果在服务器通过BeanProxy来提供重用行为并实现。获得结果之后,客户端建立一个代理来允许基础对象的个性化定制,就像RMI一样。
讨论
我们基于动态代理建造分布式系统的途径是在运行时使用多态和映像来储存对象对象数据作为订制基本目标行为的一部分。映像提供灵活但是具有强制增加额外的开支导致了执行问题。Caching是通过减少服务导入来提高执行的方法。一个管理包括caching策略的可重用代理对象全方位战略将有益于反驳映像的影响并改进执行。这个问题我们将遗留下来作为未来研究话题。
图19
我们考虑为基于动态代理的分布式系统实施提供三种途径,并且任何分析方式都是这些方式的比较来确定各自的优点。在比较三种实施方案的过程中选择方案,我们专注于不同结构的主要特点。
RMI和CORBA被认为是特地为发展面向对象分布式系统提供的两个平台,
并且他们拥有共同的特点。JAVA servlet另一方面根据请求/应答模式提供允许在客户端和服务器之间的HTTP通信的API。比较RMI协议和CORBA/IIOP协议,HTTP是在文件传输时无须身份验证并且只适合文本传输;必须连接目标且沿着通信线路发送和接收时是间断的。在通讯期、保密和处理服务需要请求身份验证。Servlets提供不记名服务,无动态类导入和无现成保密机制(通常通过servlet引擎也就是WEB服务器来管理存储安全)RMI和CORBA提供所有这些服务甚至更多。
RMI和CORBA提供相似的远距离传输存储机制。两项技术最大的不同是在语言和操作系统平台上。RMI只能在JAVA系统上运行因此只能依赖于JAVA支持的平台,而CORBA支持各种类型的系统并且可以以不同的语言和在不同的平台上运行。RMI不支持保留系统的编写,比如在公式转换语言和面向商业通用语言中;在CORBA中,服务器执行能够以不同语言编写和通过使用任何IDL语言映射的语言进行存储。
除在定义客户服器务方面有所不同之外(RMI使用JAVA界面结构,CORBA使用IDL界面结构),在体系结构方面也有轻微的不同,在RMI中,存根和纲要是由实施对象产生的,在CORBA中,存根和纲要是由IDL界面构成的。结果,在RMI中,产生的存根是细微的对象的所有细微界面的一个代理服务器,但是在CORBA中,每个界面都要求有它自己的根。
在动态代理服务器的帮助下,我们察觉有四个好处在服务器端来执行可再用代码。首先,在客户端下请求不会改变和在服务器端下客户应用程序会保留执行除附属于元代码外。第二,元代码会控制分离基础应用软件,从减少复杂性和提高可读性的代码来说这是合意的设计形体。第三,在两端之间(客户端和服务器端)相对于相应的静态事件和耦合对象,这种阶级结构展示了较少的耦合性,具有灵活性。一个元对象习惯声明几个基础对象,反之亦然。
最后,在多态现象和映象的帮助下,用户化代码被独立的执行这与特殊的应用软件没有任何关系。在运行时像这种java.lang.object变量类习惯于控制应用程序对象,映像习惯于处理对象数据。
Java的servlet实现(略)
结论和未来的研究工作
java的动态代理服务器提供了一种构造动作的映像模型的方法。在这个模型中,这个应用到应用对象的行为中的公开执行的设计原理,利用代理服务器对象组装元级别在运行时能被定制。这个元程序是一般的,不依靠任何应用程序实行的,因此是可以再度利用的。有两个设计模型被考虑过:单一的应用程序模型和客户端/服务端模型。近来,客户应用程序和服务器应用程序涉及到不同机构分布于TCP/IP网络上。考虑到的结果是java语言做为系统应用程序是不会被认知的,在未来的研究中会被遗弃。
我们使用代理映像模型实现代码重用。在分布式系统下, 这个代码被实施在服务器端和由客户获取通过RMI, COBRA/IIOP 或HTTP 协议。比较我们的代码重用方法与标准面向对象机制譬如继承和聚合(构成) 不做全面详细的谈论并且作为日后研究。
单JAVA虚拟机解决代码重用能够通过动态代理解释呼叫处理程式来作为元对象并且使用映像技术来发展。基层体系结构是开放的并且由两部分组成:基础层聚集应用对象和元-层聚集代理对象。应用对象在较低层执行默认行为。代理对象在较高层通过截取基础层操作(比如文件存储)控制基础对象的行为。提供一个解决多JAVA虚拟机以TCP/IP协议在网络中连接但是保留双层结构,我们转移单一应用到客户机/服务器应用程序上来。这种转移通过配合单一应用进入客户机/服务器应用程序来实现,同过配合单一应用代码来实现。首先,这种转移必须到RMI基础系统;接着,它到CORBA的IDL程序模式;最后,必须通过HTTP servlet的请求/应答模式。
在RMI系统中,包括了一些步骤的转移算法被监视并且在分布式环境中使用适配器模式来调节单一JAVA虚拟机功能。在分布式CORBA系统的例子中,转移通过在这种环境下使用普通的客户端/服务器应用程序来实现。首先定义一个普通IDL接口组成,接着在服务器端使用类(根和分支)来执行这些接口并通过应用运算规则来转移我们的单一应用给分布式系统,来支持ORB上的重用,这个与RMI相似。最主要的不同是 CORBA客户端或者服务器能够用JAVA,C,C++,Lisp,Python,Smalltalk,COBOL,and Ada执行,或者其他OMG指定的IDL映射的语言。在RMI中,客户端和服务器都必须使用JAVA应用程序。在HTTP协议解决方案中,我们使用java.net和javax.servlet包来查找和连接servlet并在WEB服务器上运行。Servlet 扮演了一个管理者的角色来有权使用可重用资源。接受HTTP请求,servlet使用帮助类执行重用代码对请求作出一个相当于HTTP应答的对象。
按照未来的操作,我们很普遍的研究元级别利用其他技术展现体系机构的工具问题。例如MOPS编译时间,贯彻可再用代码。动态代理服务器方法与其他的面向对象的再度编码犯法相比同样在研究中。另外,我们也同样 掩埋怎样近似再度解决元件库的缩放比例问题和询问怎样基于代理服务器支持的元对象协议反射模型调查结果。
鸣谢(略)
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9]
分布式环境中动态代理的应用外文翻译 第9页下载如图片无法显示或论文不完整,请联系qq752018766