在数据处理网络中与远程对象进行通信的制作方法

文档序号:6505010阅读:154来源:国知局
专利名称:在数据处理网络中与远程对象进行通信的制作方法
技术领域
本发明涉及数据处理网络领域,并且更特别地涉及在其中本地地调用远程对象的数据处理网络的领域。
背景技术
Java(Sun微系统公司的商标)远程方法调用(RMI)使得程序员能够创建分布式的Java应用程序,在这些应用程序中可以从通常位于不同的主机系统上的其他Java虚拟机(Java Virtual Machine)中调用远程Java对象。在Sun微系统公司的“Java Remote MethodInvocation Specification”(Java远程方法调用规范)(修订版1.9)(http://java.sun.com/j2se/1.4.2/docs/guide/rmi/spec/rmi-title.html)中更加详细地描述了Java RMI。“远程对象”(remote object)定义为可以实现java.rmi.remote接口的对象。然而,出于本公开的目的,可以将远程对象考虑为不加载到试图对其进行调用的JVM(Java虚拟机)中的对象。
一旦通过使用由RMI提供的命名服务查找远程对象或通过接收作为自变量或返回值的引用而获得了对远程对象的引用,基于Java的程序就可以对该远程对象进行调用。客户端可以调用服务器中的远程对象,并且该服务器还可以是其他远程对象的客户端。
RMI使用对象串行化(object serialization)来对用于远程对象调用的自变量进行列集(marshal)和散集(unmarshal)。“对象串行化”指的是向未经处理的字节流写入整个对象或从未经处理的字节流中读取整个对象的能力。对象串行化使得能够将Java对象和原语(primitive)编码到字节流中,这些字节流适合于流式传送到某些类型的网络、流式传送到文件系统或更一般地流式传送到传输介质或存储设备。
参考图1,其中示出了传统的Java远程对象调用的概念表示。在所示出的实施例中,在客户端计算机101上编译Java源代码文件(.java文件)102,以创建可以由包括Java虚拟机(JVM)的Java运行时环境(JRE)执行的Java字节代码(.class文件)110。JRE和JVM在Java编程领域中是公知的。
在执行客户端应用程序(即.class文件110)之前,将RMI编译器(RMIC)114用于创建stub文件118以及tie文件或skeleton文件122。(在一个基于因特网ORB间协议(IIOP)的实施例中创建tie文件,而在一个基于Java远程方法协议(JRMP)的实施例中创建skeleton文件)。stub文件118是用于远程对象的代理。stub文件118负责将关于远程对象的方法调用转发给驻留了实际远程对象实现的服务器。tie文件122是服务器端的与stub文件118相似的文件。tie文件122用于将对象和参数返回给客户端的应用程序。
class文件110包含对远程对象130的引用,该引用实际上是对stub 118的引用。当class 110对远程对象130进行调用时,stub 118是用以将该远程对象调用转发给驻留了该远程对象的服务器的class文件。stub 118通过对远程对象调用参数进行串行化并经由使用常规TCP/IP(传输控制协议/网际协议)的网络发送该串行化字节流来执行这种功能。tie文件122在远程对象服务器端执行相似的功能。
参考图2,其中示出了常规的Java RMI运行时序列的概念表示。在所示出的例子中,由相应的JVM(未示出)执行的.class文件110包含对远程对象130的调用。当执行对远程对象130的调用时,通过stub文件118来实现远程调用。更具体而言,将对远程对象130(包括该远程对象所需的任意参数和对象)的调用传送(用参考标号202表示)给stub文件118。stub文件118负责对该远程对象调用以及该调用的自变量进行串行化,并负责将串行化字节流发送(参考标号204)给服务器端的JVM(未示出),该远程对象在该JVM下执行。
在所示出的示例中,Java应用程序文件110和远程对象130驻留在不同的机器上,其中将Java应用程序文件110示出为驻留在“客户端”计算机201上并且将远程对象示出为驻留在“服务器端”计算机203上。在这种配置中,客户端201与服务器端203之间的串行化字节流传送优选地使用诸如TCP/IP之类的常规网络协议栈来实现。
在服务器端203上,tie文件122接收由stub文件118发送的串行化字节流,并对相应的自变量进行解串行化(de-serialize)和散集以重构远程对象调用的对象以及参数。将解串行化的对象和/或参数提交(参考标号206)给远程对象130用于执行。远程对象130随后使用接收到的对象和/或参数执行服务器端203并产生一组结果参数和/或对象,将这组结果参数和/或对象返回(参考标号208)给tie文件122。tie文件122对自变量进行串行化,并将串行化的数据发回(参考标号210)客户端201。stub文件118随后负责对该串行化的对象和参数进行散集,然后将非串行化的数据返回(参考标号212)给客户端应用程序。
在某些情况下,在客户端系统上不存在用于特定远程对象的stub,并且生成了“ClassNotFoundException”(没有找到类的异常)。例如,当客户端应用程序不具有对远程对象的直接引用,而是作为替代从例如Java命名和目录服务(JNDI)之类的命名服务中检索到对远程对象的引用时,这种情况就可能发生。在这种情况下,由于在编译时不能预见调用会将哪个远程对象返回给命名服务,程序员不能保证会存在适当的stub。在另一个例子中,对第一远程对象的客户端调用向客户端返回对第二远程对象的引用(作为由第一远程对象发起的调用中的一个参数或作为对客户端远程对象调用的返回值)。在这种情况中,从服务器端返回的远程对象的名称在编译时是不可知的,并且在系统上不存在适当的stub。希望通过实现一种用于创建“缺失”的(missing)stub类文件以适应客户设备需要进行的远程对象调用的方法和系统来消除这种错误源。如果可以在运行时动态地操作所实现的解决方案以改善运行时性能并减少不期望的重编译量,则将是更加令人期待的。

发明内容
一种用于在数据处理系统中调用远程对象的方法和计算机程序产品,包括响应于执行远程对象调用,生成包含该远程对象及其自变量的串行化字节流。将该串行化字节流发送到包含该对象的服务器。响应于接收到包含由该远程对象产生的结果的第二串行化字节流以及确定在第二字节流中存在找不到对应的任何引用的第二远程对象,使用第二串行化字节流中包含的信息来确定该第二远程对象的类类型。与该第二远程对象的类类型兼容的代理用于调用该第二远程对象。针对该第二远程对象使用代理可以包括确定是否存在与该第二远程对象类类型兼容的代理,并且如果存在与该第二远程对象类类型兼容的代理,则在运行时加载该代理。响应于确定不存在与该第二远程对象类兼容的代理,在运行时生成适当的代理并将其用于调用该第二远程对象。确定是否存在兼容的代理可以包括确定是否存在用于该第二远程对象类类型的代理,并且如果不存在用于该第二远程对象类类型的代理,则确定与该第二远程对象兼容的最相关的类类型,并随后确定是否存在用于该最相关的兼容类类型的代理。在一种实现中,代理包括Java stub文件。


通过阅读以下详细描述并通过参考附图,本发明的其他目的和优点将变得明显,附图中图1是使用根据现有技术的远程方法调用的Java应用程序的选定单元的框图;图2是图1的Java应用程序的运行时环境的概念示图;图3是用于加载或生成用于采用远程方法调用的Java应用程序的适当的stub文件的方法和相应的计算机程序产品的流程图;以及图4是说明图3的自动stub加载/创建的实施例的流程图。
尽管本发明容易获得各种修改和替换形式,但是在此将详细地描述并通过附图中的例子示出本发明的特定实施例。然而,应当理解,在此提供的附图和详细描述的目的不是将本发明限制为所公开的特定实施例,而是相反,其目的是覆盖所有在由所附权利要求限定的本发明的本质和范围内的修改、等效和替代。
具体实施例方式
一般而言,本发明针对一种方法和系统,其中Java运行时环境(JRE)能够在执行对该JRE不包含对应的任何stub的远程对象的调用时采取纠正措施。当JRE遇到用于远程对象的不能解串行化的对象stub时,JRE基于该远程对象的类类型或基于该远程对象继承链中的某些其他类或接口的类类型自动地生成适当的stub。由于所有的Java类都源于公共根类,因此客户端JRE将识别远程对象本身的类类型(一个类,远程对象的类类型是源于该类的扩展)或由该对象实现的接口。使用由远程对象发送的Java类类型信息、结合任意JRE中固有的搜索和类加载能力来实现自动的stub生成。如果JRE不具有用于与远程对象兼容的最相关类类型的stub,则自动地生成对应于该类类型的stub。以这种方式,接收JRE能够接收和处理任意远程对象,不管该JRE是否具体了解该远程对象的类型。
本发明的基本部分可以实现为一组或一系列计算机可执行指令,其存储在计算机可读介质上,用于在基于Java技术的应用或环境中生成完成对远程对象的调用所需的stub。该软件可以驻留在诸如磁盘、磁带、CD-ROM(压缩光盘-只读存储器)、闪存之类的永久性介质中或其他形式的电可变ROM(只读存储器)中。在其他情况下,该软件的一部分可以驻留在数据处理系统的诸如系统内存(DRAM(动态随机存取存储器))之类的易失性存储介质或高速缓冲存储器(SRAM(静态随机存取存储器))中,其中数据处理系统通常是执行该软件的客户端计算机。
现在转向附图,图3是根据本发明的一个实施例的执行Java应用程序的方法300的流程图,其中客户设备在接收到客户端对其不具有任何相应的stub的远程对象时生成客户端stub。在所示出的实施例中,当在客户机上执行的Java应用程序进行对远程对象(为了将此远程对象与其他的远程对象区分开,将此远程对象称为第一远程对象)的调用(方框302)时,方法300开始。这在此称为对远程对象的直接调用。如果适当地构造了应用程序,则执行应用程序的JRE(客户端JRE)识别远程对象并具有对应于该远程对象的stub类文件。该stub类文件使得JRE能够将该调用转发给远程JRE用于执行。
响应于在方框302中遇到的远程对象调用,JRE将调用对应于该远程对象的stub类文件以便将远程调用串行化(方框304)并将串行化的字节流发送(方框306)给第一远程对象“驻留”的JRE(远程JRE或服务器端JRE)。如上所述,串行化包括对与远程对象或其相应方法相关联的任意自变量的串行化。
接收到该串行化的字节流之后,远程JRE随后对该字节流进行解串行化(方框308),以重构随着远程对象调用发送的对象。恢复对应于远程调用的自变量之后,远程JRE能够调用(方框310)远程对象以产生返回(方框312)给客户端JRE的结果。该返回结果可以包括返回值或含一个或多个自变量的对另一对象的调用。在返回值的情况下,返回值本身可以是相对于客户端JRE来说为远程对象的对象。相似地,在返回对象调用的情况下,调用的自变量可以是远程对象。
在接收到从远程JRE返回的结果之后,客户端JRE解析(方框314)其从服务器端JRE接收到的返回值和/或返回参数。如果客户端JRE检测到(方框316)远程对象,则该客户端JRE随后确定(方框318)其是否具有用于该远程对象的相应的stub。如果该客户端JRE确定其不具有用于一个或多个从服务器端JRE返回的远程对象的stub类文件,则该客户端JRE随后自动地生成(方框320)适当的stub,并使用(方框322)该生成的stub来调用该远程对象。
在一个实施例中,如图4中概念性地示出的那样,实现适当的stub的自动生成。如前所示,当从远程JRE接收到作为串行化字节流的一部分的对象时,客户端JRE首先试图使用适当的stub对该对象进行解串行化。当JRE确定由于没有加载对应于该对象的类类型的stub文件而不能对特定对象进行解串行化时,该JRE首先确定(方框402)对应于未识别的远程对象的类类型信息。为了进行这种确定,本发明的一个实施例基于在客户端与服务器端之间流动的串行化字节流中内嵌的“字符串化的”(stringified)对象引用,其称为可互操作对象引用(IOR)。IOR包含typeID(类型标识符)信息,typeID信息标识了相应的对象引用的类类型。通过解析找不到相应的stub的远程对象的IOR,客户端可以确定该对象的类类型。
客户端JRE使用IOR的typeID(有可能结合IOR中的附加记录)来确定(方框404)对象的继承特性以及由对象实现的接口。根据这一信息,客户端JRE随后使用JRE的搜索命令来找到并加载(方框406)与该对象兼容的最相关的类类型。每个Java类(除了对象类本身)从另一个类中得出或“扩展”(extend)了另一个类。类的每个扩展“继承”(inherit)其祖先(ancestor)的所有状态和行为,包括其祖先的方法和变量。Java的继承特性确保了所有JRE能够识别对象的类类型或对象的祖先的类类型。在很多实例中,未识别的远程对象的最相关类的祖先包含足够的状态和行为来定义用于所考虑的对象的可接受的stub文件。
一旦加载了特定对象的最相关的类类型,JRE随后就能够确定(方框408)是否存在对应于该类的stub文件。如果存在对应的stub文件,则JRE将该stub文件加载(方框410)到适当的类加载程序(loader)中。如果不存在stub文件,则JRE调用(方框412)针对适当接口的RMI编译器以在运行时创建stub。然后将编译stub文件加载到适当的类加载程序中。以这种方式,客户端JRE能够在事先不具体知道远程对象的类类型的情况下解决远程对象的引用。在优选的实现中,将即时(on-the-fly)的stub加载和创建结合到JRE本身中。在其他实施例中,将该功能性实现为Java类库扩展。
可以受益于本公开的本领域普通技术人员将很清楚,本发明考虑了一种用于在使用RMI的Java应用程序中实现自动的stub文件创建的机制。应当理解,在详细描述和附图中示出和描述的本发明的形式应仅看作是目前优选的例子。应当对所附的权利要求进行广义的解释,以便包含所公开的优选实施例的所有变型。
一种在数据处理系统中执行远程过程的方法,包括响应于远程对象调用,生成包含所述远程对象及其自变量的串行化字节流;将所述串行化字节流发送到包含所述对象的服务器;响应于接收到包含由所述远程对象产生的结果的第二串行化字节流以及确定存在找不到对应的任何引用的第二远程对象,使用所述第二串行化字节流中包含的信息来确定所述第二远程对象的类类型;以及使用与所述第二远程对象的类类型兼容的代理来调用所述第二远程对象。
2.根据权利要求1所述的方法,其中针对所述第二远程对象使用所述代理包括确定是否存在与所述第二远程对象的类类型兼容的代理,以及如果存在与所述第二远程对象的类类型兼容的代理,则在运行时加载所述代理。
3.根据权利要求2所述的方法,还包括响应于确定不存在与所述第二远程对象的类兼容的代理,在运行时生成适当的代理,并使用所述生成的代理来调用所述第二远程对象。
4.根据权利要求3所述的方法,其中在运行时生成适当的代理包括在运行时调用Java RMI编译器。
5.根据权利要求2所述的方法,其中确定是否存在兼容的代理包括确定是否存在用于所述第二远程对象类类型的代理,以及如果不存在用于所述第二远程对象类类型的代理,则确定与所述第二远程对象兼容的最相关类类型并确定是否存在用于所述最相关的兼容类类型的代理。
6.根据权利要求1所述的方法,其中所述代理包括Java stub文件。
7.根据权利要求1所述的方法,其中使用所述串行化字节流中包含的信息来确定所述第二远程对象的类类型包括使用所述串行化字节流中的typeID信息。
8.根据权利要求7所述的方法,还包括使用所述对象的继承和接口来确定所述第二远程对象的类类型。
9.一种用于执行远程过程的计算机程序产品,所述计算机程序产品包括一组存储在计算机可读介质上的计算机可执行指令,所述计算机程序产品包括存储在客户端系统上、用于确定是否存在从服务器端的系统接收的远程对象引用的计算机代码装置;用于确定是否在所述客户端系统上识别了所述远程对象引用的计算机代码装置;响应于确定没有识别所述远程对象引用,用于在运行时确定或生成用于所述远程对象的代理的计算机代码装置;以及用于使用所述代理从所述客户端系统调用所述远程对象的计算机代码装置。
10.根据权利要求9所述的计算机程序产品,其中所述用于确定是否识别了所述远程对象引用的代码装置包括用于确定所述远程对象引用的类类型的代码装置。
11.根据权利要求10所述的计算机程序产品,其中所述用于确定或生成用于所述远程对象的代理的代码装置包括用于确定由所述客户端系统识别的与所述远程对象的类类型兼容的最相关的对象类的代码装置。
12.根据权利要求11所述的计算机程序产品,其中所述用于确定或生成代理的代码装置还包括用于确定是否存在对应于所述最相关的对象类的代理的代码装置,以及如果不存在对应于所述最相关的对象类的代理,用于在运行时编译对应于所述最相关的对象类的代理的代码装置。
13.一种计算机程序产品,其包括一组用于执行远程过程的计算机可执行指令,所述指令存储在计算机可读介质上,所述计算机程序产品包括用于响应于远程对象调用而生成包含所述远程对象及其自变量的串行化字节流的代码装置;用于将所述串行化字节流发送到包含所述对象的服务器的代码装置;响应于接收到包含由所述远程对象产生的结果的第二串行化字节流以及确定存在找不到对应的任何引用的第二远程对象,用于使用第二串行化字节流中包含的信息来确定所述第二远程对象的类类型的代码装置;以及用于使用与所述第二远程对象的类类型兼容的代理来调用所述第二远程对象的代码装置。
14.根据权利要求13所述的计算机程序产品,其中所述用于针对所述第二远程对象使用所述代理的代码装置包括用于确定是否存在与所述第二远程对象类类型兼容的代理,以及如果存在与所述第二远程对象类类型兼容的代理,则在运行时加载所述代理的代码装置。
15.根据权利要求14所述的计算机程序产品,还包括响应于确定不存在与所述第二远程对象类兼容的代理,用于在运行时生成适当的代理并使用所述生成的代理来调用所述第二远程对象的代码装置。
16.根据权利要求15所述的计算机程序产品,其中所述用于在运行时生成适当的代理的代码装置包括用于在运行时调用Java RMI编译器的代码装置。
17.根据权利要求14所述的计算机程序产品,其中所述用于确定是否存在兼容的代理的代码装置包括用于确定是否存在用于所述第二远程对象类类型的代理的代码装置,以及如果不存在用于所述第二远程对象类类型的代理,用于确定与所述第二远程对象兼容的最相关的类类型并确定是否存在用于所述最相关的兼容类类型的代理的代码装置。
18.根据权利要求13所述的计算机程序产品,其中所述代理包括Java stub文件。
19.根据权利要求13所述的计算机程序产品,其中用于使用所述串行化字节流中包含的信息来确定所述第二远程对象的类类型的代码装置包括用于使用所述串行化字节流中的typeID信息的代码装置。
20.根据权利要求19所述的计算机程序产品,还包括用于使用所述对象的继承和接口来确定所述第二远程对象的类类型的代码装置。
权利要求
1.一种在数据处理系统中执行远程过程的方法,包括响应于远程对象调用,生成包含所述远程对象及其自变量的串行化字节流;将所述串行化字节流发送到包含所述对象的服务器;响应于接收到包含由所述远程对象产生的结果的第二串行化字节流以及确定存在找不到对应的任何引用的第二远程对象,使用所述第二串行化字节流中包含的信息来确定所述第二远程对象的类类型;以及使用与所述第二远程对象的类类型兼容的代理来调用所述第二远程对象。
2.根据权利要求1所述的方法,其中针对所述第二远程对象使用所述代理包括确定是否存在与所述第二远程对象的类类型兼容的代理,以及如果存在与所述第二远程对象的类类型兼容的代理,则在运行时加载所述代理。
3.根据权利要求2所述的方法,还包括响应于确定不存在与所述第二远程对象的类兼容的代理,在运行时生成适当的代理,并使用所述生成的代理来调用所述第二远程对象。
4.根据权利要求3所述的方法,其中在运行时生成适当的代理包括在运行时调用Java RMI编译器。
5.根据权利要求2所述的方法,其中确定是否存在兼容的代理包括确定是否存在用于所述第二远程对象类类型的代理,以及如果不存在用于所述第二远程对象类类型的代理,则确定与所述第二远程对象兼容的最相关类类型并确定是否存在用于所述最相关的兼容类类型的代理。
6.根据权利要求1所述的方法,其中所述代理包括Java stub文件。
7.根据权利要求1所述的方法,其中使用所述串行化字节流中包含的信息来确定所述第二远程对象的类类型包括使用所述串行化字节流中的typeID信息。
8.根据权利要求7所述的方法,还包括使用所述对象的继承和接口来确定所述第二远程对象的类类型。
9.一种用于执行远程过程的计算机程序产品,所述计算机程序产品包括一组存储在计算机可读介质上的计算机可执行指令,所述计算机程序产品包括存储在客户端系统上、用于确定是否存在从服务器端的系统接收的远程对象引用的计算机代码装置;用于确定是否在所述客户端系统上识别了所述远程对象引用的计算机代码装置;响应于确定没有识别所述远程对象引用,用于在运行时确定或生成用于所述远程对象的代理的计算机代码装置;以及用于使用所述代理从所述客户端系统调用所述远程对象的计算机代码装置。
10.根据权利要求9所述的计算机程序产品,其中所述用于确定是否识别了所述远程对象引用的代码装置包括用于确定所述远程对象引用的类类型的代码装置。
11.根据权利要求10所述的计算机程序产品,其中所述用于确定或生成用于所述远程对象的代理的代码装置包括用于确定由所述客户端系统识别的与所述远程对象的类类型兼容的最相关的对象类的代码装置。
12.根据权利要求11所述的计算机程序产品,其中所述用于确定或生成代理的代码装置还包括用于确定是否存在对应于所述最相关的对象类的代理的代码装置,以及如果不存在对应于所述最相关的对象类的代理,用于在运行时编译对应于所述最相关的对象类的代理的代码装置。
13.一种计算机程序产品,其包括一组用于执行远程过程的计算机可执行指令,所述指令存储在计算机可读介质上,所述计算机程序产品包括用于响应于远程对象调用而生成包含所述远程对象及其自变量的串行化字节流的代码装置;用于将所述串行化字节流发送到包含所述对象的服务器的代码装置;响应于接收到包含由所述远程对象产生的结果的第二串行化字节流以及确定存在找不到对应的任何引用的第二远程对象,用于使用第二串行化字节流中包含的信息来确定所述第二远程对象的类类型的代码装置;以及用于使用与所述第二远程对象的类类型兼容的代理来调用所述第二远程对象的代码装置。
14.根据权利要求13所述的计算机程序产品,其中所述用于针对所述第二远程对象使用所述代理的代码装置包括用于确定是否存在与所述第二远程对象类类型兼容的代理,以及如果存在与所述第二远程对象类类型兼容的代理,则在运行时加载所述代理的代码装置。
15.根据权利要求14所述的计算机程序产品,还包括响应于确定不存在与所述第二远程对象类兼容的代理,用于在运行时生成适当的代理并使用所述生成的代理来调用所述第二远程对象的代码装置。
16.根据权利要求15所述的计算机程序产品,其中所述用于在运行时生成适当的代理的代码装置包括用于在运行时调用Java RMI编译器的代码装置。
17.根据权利要求14所述的计算机程序产品,其中所述用于确定是否存在兼容的代理的代码装置包括用于确定是否存在用于所述第二远程对象类类型的代理的代码装置,以及如果不存在用于所述第二远程对象类类型的代理,用于确定与所述第二远程对象兼容的最相关的类类型并确定是否存在用于所述最相关的兼容类类型的代理的代码装置。
18.根据权利要求13所述的计算机程序产品,其中所述代理包括Java stub文件。
19.根据权利要求13所述的计算机程序产品,其中用于使用所述串行化字节流中包含的信息来确定所述第二远程对象的类类型的代码装置包括用于使用所述串行化字节流中的typeID信息的代码装置。
20.根据权利要求19所述的计算机程序产品,还包括用于使用所述对象的继承和接口来确定所述第二远程对象的类类型的代码装置。
全文摘要
一种用于在数据处理系统中调用远程对象的方法和计算机程序产品,包括响应于执行远程对象调用而生成包含远程对象及其自变量的串行化字节流。将该串行化字节流发送给包含该对象的服务器。响应于接收到包含由该远程对象产生的结果的第二串行化字节流以及确定在该第二字节流中存在找不到对其的任何引用的第二远程对象,使用第二串行化字节流中包含的信息来确定该第二远程对象的类类型。如果事先不存在与该第二远程对象的类类型兼容的代理,则在客户端上自动地生成并编译这种代理,或者如果已经存在这种代理,则在运行时加载这种代理以便调用该第二远程对象。
文档编号G06F9/46GK1902589SQ200480040344
公开日2007年1月24日 申请日期2004年12月14日 优先权日2004年1月12日
发明者斯科特·布劳斯萨德, 刘 英, 埃杜瓦多·斯普林 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1