JEE值对象模式在分布式结构中的分析及应用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

值对象模式在分布式结构中的分析及应用1引言在与远程对象通信时,需要权衡的因素有以下几点:远程调用(那些必须跨越网络的调用)速度缓慢。虽然许多远程调用框架可以隐藏进行远程调用的复杂性(如RMI),但是它们不能消除发生通信所需的步骤。例如,必须先找到远程对象位置,而且建立与远程计算机的连接,然后才能将数据串行化为字节流,然后可能进行加密,最后才能将其传输到远程计算机。在考虑网络性能时,必须同时考虑滞后时间和吞吐量。简单地说,滞后时间描述了数据的首字节到达目的地之前所经过的时间。吞吐量描述了在某个时间段(例如1秒)内通过网络发送的数据字节数。在基于IP路由的现代网络(例如Internet)中,滞后时间可以是比吞吐量更大的因素。这意味着,传输10字节数据所用的时间可能几乎等于传输1,000字节数据所用的时间。在使用无连接协议(如HTTP)时,此效果尤其明显。通常,网络速度越快可以使吞吐量得以增加,但是,要减少滞后时间则会更加困难。在设计对象接口时,好的做法是将大量信息隐藏在对象内,并提供一组细粒度方法来访问和操作该信息。细粒度意味着每个方法都应该负责单个的、相当小的和基本的功能单位。此方法简化了编程,并提供了对对象内部的更佳抽象,从而增加了重用的可能性。必须根据以下事实对此进行平衡取舍:使用较细粒度的方法意味着需要调用更多的方法才能执行高级别的任务。通常,在同一进程内调用方法时,这些额外函数调用的开销是可接受的;但是,在跨进程和网络边界调用这些方法时,开销可能变得难以接受。避免远程调用中固有的滞后时间问题的最佳方法是进行更少的调用,并让每个调用传递更多的数据。做到这一点的一种方法是,使用长参数列表来声明远程方法。这样,客户端就可以在单个调用中将更多的信息传递给远程组件。但是,这样做会使针对此接口的编程容易出错,因为程序很可能仅按调用语句中的位置来调用外部方法的参数。例如,如果远程方法接受10个字符串参数,则开发人员很容易按错误顺序传递参数。编译器将无法检测到这样的错误。长参数列表无助于从远程调用向客户端返回更多的信息,因为大多数的编程语言将方法调用的返回类型限制为单个参数。而巧合的是,在传输大多数数据时通常需要返回较多信息。例如,许多用户接口传输少量的信息,却希望返回大量结果数据。2RMI的工作原理2.1概述JavaRMI(RemoteMethodInvocation远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而JavaRMI则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。RMI目前使用Java远程消息交换协议JRMP(JavaRemoteMessagingProtocol)进行通信。JRMP是专为Java的远程对象制定的协议。因此,JavaRMI具有Java的WriteOnce,RunAnywhere的优点,是分布式应用系统的百分之百纯Java解决方案。用JavaRMI开发的应用系统可以部署在任何支持JRE(JavaRunEnvironmentJava,运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。本文拟从程序的角度举例介绍怎样利用RMI实现Java分布式应用。2.2工作机制在与远程对象的通信过程中,RMI使用标准机制:stub和skeleton。远程对象的stub担当远程对象的客户本地代表或代理人角色。调用程序将调用本地stub的方法,而本地stub将负责执行对远程对象的方法调用。在RMI中,远程对象的stub与该远程对象所实现的远程接口集相同。调用stub的方法时将执行下列操作:(1)初始化与包含远程对象的远程虚拟机的连接;(2)对远程虚拟机的参数进行编组(写入并传输);(3)等待方法调用结果;(4)解编(读取)返回值或返回的异常;(5)将值返回给调用程序。为了向调用程序展示比较简单的调用机制,stub将参数的序列化和网络级通信等细节隐藏了起来。在远程虚拟机中,每个远程对象都可以有相应的skeleton(在JDK1.2环境中无需使用skeleton)。Skeleton负责将调用分配给实际的远程对象实现。它在接收方法调用时执行下列操作:(1)解编(读取)远程方法的参数;(2)调用实际远程对象实现上的方法;(3)将结果(返回值或异常)编组(写入并传输)给调用程序。stub和skeleton由rmic编译器生成。2.3RMI分布式应用程序机制:(1)定位远程对象。应用程序可使用两种机制中的一种得到对远程对象的引用。它既可用RMI的简单命名工具rmiregistry来注册它的远程对象,也可以将远程对象引用作为常规操作的一部分来进行传递和返回。(2)与远程对象通信。远程对象间通信的细节由RMI处理,对于程序员来说,远程通信看起来就像标准的Java方法调用。(3)给作为参数或返回值传递的对象加载类字节码。因为RMI允许调用程序将纯Java对象传给远程对象,所以,RMI将提供必要的机制,既可以加载对象的代码又可以传输对象的数据。在RMI分布式应用程序运行时,服务器调用注册服务程序以使名字与远程对象相关联。客户机在服务器上的注册服务程序中用远程对象的名字查找该远程对象,然后调用它的方法。3值对象(valueobject)模式值对象(valueobject)模式通过减少分布式通信的消息而促进数据的交换,通常这里所指的通信是在Client层和EJB层之间。在一个远程调用中,一个单一值对象可以被用来取出一系列相关数据并提供给客户。这种设计模式的出现是基于客户需要与ejb大量地交换数据的情况。具体来说,在J2EE平台中,应用系统通常将服务器端的程序组件实现为会话bean和实体bean,而这些组件的部分方法则需要将数据返回给客户;这种情况下,通常一个用户会重复调用相关方法多次,直到它得到相关信息,应该注意的是,多数情况这些方法调用的目的都是为了取得单一的信息,例如用户名或者用户地址等。在J2EE平台上,这种调用基本上都是来自远程的。也就是说,用户多次调用相应的方法会给应用服务器带来极大的负担,即使用户和EJB容器加载相同的JVM、OS和计算机上运行EJB程序,由于方法调用被缺省地认为是远程任务,所以这种问题依然存在。由于以上所提到的问题,在远程方法的调用次数增加的时候,相关的应用程序性能将会有很大的下降,因此利用多次方法调用而取得单一的信息是非常低效的;在这种情况,建议使用传输对象来包含所有的程序数据,即每次方法调用可以发送和接收这个传输对象;当用户向EJB发出对于程序数据的请求时,EJB会创建这个传输对象,将它的各个域赋以相关的数值,并将整个对象传送给用户。4值对象能提高J2EE中RMI的效率使用粗粒度数据对象来代表这些信息,我们把EJB中的属性变量整和到一个数据对象ContactInFORMation中,之后该对象序列化后被传输到客户端调用,在那里被逆序列化后被客户解读,可以看出后来的解读过程是客户端对本地对象的操作,而不是对远程EJB的操作,所以没有占用服务器的工作,减少了资源利用。5值对象在RMI中传输必须序列化在RMI分布式应用系统中,服务器与客户机之间传递的Java对象必须是可序列化的对象。不可序列化的对象不能在对象流中进行传递。对象序列化扩展了核心Java输入/输出类,同时也支持对象。对象序列化支持把对象编码以及将通过它们可访问到的对象编码变成字节流;同时,它也支持流中对象图形的互补重构造。序列化用于轻型持久性和借助于套接字或远程方法调用(RMI)进行的通信。序列化中现在包括一个API(ApplicationProgrammingInterface,应用程序接口),允许独立于类的域指定对象的序列化数据,并允许使用现有协议将序列化数据域写入流中或从流中读取,以确保与缺省读写机制的兼容性。为编写应用程序,除多数瞬态应用程序外,都必须具备存储和检索Java对象的能力。以序列化方式存储和检索对象的关键在于提供重新构造该对象所需的足够对象状态。存储到流的对象可能会支持Serializable(可序列化)或Externalizable(可外部化)接口。对于Java对象,序列化形式必须能标识和校验存储其内容的对象所属的Java类,并且将该内容还原为新的实例。对于可序列化对象,流将提供足够的信息将流的域还原为类的兼容版本。对于可外部化对象,类将全权负责其内容的外部格式。序列化Java对象的目的是:提供一种简单但可扩充的机制,以序列化方式维护Java对象的类型及安全属性;具有支持编组和解编的扩展能力以满足远程对象的需要;具有可扩展性以支持Java对象的简单持久性;只有在自定义时,才需对每个类提供序列化自实现;允许对象定义其外部格式。6对象模式体系结构EJB使用传输对象的时候,用户可以通过仅仅一次方法调用来取得整个对象,而不是使用多次方法调用以得到对象中每个域的数值;由于传输对象是通过值传递而交送给用户的,所以所有对于该传输对象的调用或取值都是本地调用,而不是远程方法调用。不过需要注意的是,这个传输对象必须具有对应于每个属性的访问方法,或者将所有属性都设为公共的。类图1表示了值对象模式的体系结构。BussinessSessionSessionEJBDataAccessObjectBussinessEntityEntityEJBBussinessObjectClientValueObjectcreate图1值对象类图在图1中,传输对象首先在EJB中创建,然后返回给远程客户;当然,传输对象也可以根据需要融合其他的设计模式。7对象模式参与模块的交互图2显示了传输对象模式中的参与模块和它们之间的交互。ClientBussinessObjectServerCopy:ValueObjectClientCopy:ValueObject1:GetData1.1Create1.2:ReturnValueObject1.2.1Create2:GetValue图2值对象序列图传输对象模式的各个参与模块:(1)客户(Client)。客户代表了EJB所提供服务的使用者,通常是运行于用户终端的应用程序。(2)业务对象。业务对象表示在一个模式中由会话bean、实体bean或数据访问对象(DataAccessObject)实现的角色。业务对象通常负责创建传输对象,并根据请求将其传送到相关的用户;业务对象也可以从用户中取得一个传输对象格式的数据,并应用这些数据来执行一些更新。(3)传输对象。传输对象是一个可序列化的Java对象。在这个对象的类中,通常会有一个包含所有域的构造函数,用来创建这个传输对象。这个传输对象中的成员变量基本都被定义为公共,从而无需为它们提供相关的访问方法。当然如果存在一定安全的需要,相关的成员变量也可以设为保护或私有,并且给定各自的访问方法。由此可见,传输对象的设计是随着应用系统的需要不同而改变的,是否将对象中的成员变量设为公共,或提供一定的访问方法,将是一个很重要的设计问题。通常在实现这个模式时,最多采取的是可更新的传输对象策略和多传输对象策略。在可更新的传输对象策略中,传输对象不仅可以从服务于用户的业务对象中取得相关信息和数据,还可以从业务对象中得到用户对于数据所需要进行的改变。8值对象在业务中的应用8.1更新值对象类图说明图3以类图表的形式表明了业务对象和传输对象之间的关系。图3可更新值对象类图业务对象创建了传输对象。而用户通过访问业务对象,既得到了所需的信息,也对相关数据做出了一定的修改;为了能够使得用户可以修改业务对象各个域的取值,这个对象必须提供一定的变值方法

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功