Java远程方法调用(RMI)系统允许运行在一台虚拟机上的对象去调用在另一台虚拟机上的对象。RMI提供了以Java程序语言编写的应用之间的远程通信。
注意:如果存在一个IDL程序,你应该是Java IDL而不是RMI
这里提供了一个RMI系统简明介绍,并通过一个完整的Client/Server例子,使用RMI的独特功能来在运行时加载和执行用户自定义任务。这个例子的服务器实现了一个通用的计算引擎,客户端使用它计算PI值。
RMI应用程序概览 描述了RMI系统并列出其优点。另外,这节提供了一个典型RMI应用的描述,由服务器和客户端组成,并介绍了其重要项。
写一个RMI服务器 走读计算引擎服务器代码。这节教你如何设计和实现一个RMI服务器
创建一个RMI客户端 看一个可能的计算引擎客户端并使用它阐明一个RMI客户端的重要功能
编译和运行例子 演示了如何编译和运行计算引擎的服务器和客户端
RMI应用程序概要
RMI应用程序由两个部分组成,服务器和客户端。一个典型服务器程序创建一些远程对象,使得这些对象的依赖可以引用,并等待客户端调用这些对象上的方法。一个典型的客户端拥有一个服务器上的一个或多个对象的依赖并调用它们的方法。RMI提供了服务器和客户端之间的通信原理并传回信息等等。这样的应用程序有时候被称为一个分布式对象应用程序。
分布式对象应用需要做到以下几点 :
1 定位远程对象 应用程序可以用不同的原理来获取远程对象的依赖。例如,一个应用可以通过RMI的简单命名设备(RMI注册器)注册它的远程对象。或者,应用可以传递和返回远程对象依赖,作为其他远程调用部分。
2 与远程对象通信 远程对象之间通信的细节由RMI控制。对于开发者,远程通信与一般的Java方法调用差不多。
3 加载传递的对象的类定义 因为RMI能够使对象被传回等等,提供了加载对象类定义和传递一个对象的值的机理。
下面的例图描绘了一个RMI分布式应用,使用RMI注册器来获取远程对象的依赖。服务器调用注册器来获取或绑定一个远程对象的名字。客户端通过在服务端的注册器的对象名的查看远程对象并调用其上的方法。下面的例图也显示了RMI系统使用已存在的web 服务器加载类定义,从服务器到客户端和从客户端到服务器,当需要对象的时候。
动态代码加载的优点
RMI的核心和独有的功能之一是它能够下载一个对象类的定义,如果那个累没有定义在接受者的Java虚拟机中。一个对象的所有类型和行为,在单一个Java虚拟机中已经可用,能够被传递到另一个Java虚拟机,可能是远程的。RMI通过现有的类传递对象,这样了当对象发送到另一个虚拟机的时候,对象的行为不会改变。这种能力能使新的类型和行为传到一个远程的Java虚拟机上,这样动态的扩展了应用的行为。这节中计算引擎例子用了这个功能将新的行为传到一个分布式程序中。
远程接口,对象和方法
像其他的Java程序,由JavaRMI构建的分布式应用是由接口和类组成。接口申明了方法。类实现了接口中申明的方法并且有可能申明更多的方法。在一个分布式应用中,一些实现可能存在于一些Java 虚拟机上而其他的没有。伴随着方法能被调用并横穿Java 虚拟机上的对象叫做远程对象。
一个对象实现了remote接口就成为了远程,它有以下特性java.rmi.Remote
1 一个远程接口实现了java.rmi.Remote
接口
2 接口中的每个方法在它的throws块中申明了j
,除了应用特有的异常之外。ava.rmi.RemoteException
RMI对待一个远程对象和一个非远程对象是不同的,当一个对象从一个Java虚拟机传到另一个Java虚拟机上。不是在接受的Java虚拟机上创建一个实现类的复制,而是传递远程对象的一个远程存根(我想应该使引用吧)。存根为远程对象扮演一个本地代表或者一个代理,基本上是面向客户端的,远程的依赖。客户端调用本地存根上的方法,负责执行远程对象的方法调用。
远程对象的存根实现了一组相同的远程接口,由远程对象实现。这个属性可以使一个存根转换成接口中的任何一个,远程对象实现的。可是,只有那些定义在远程接口中的方法可以从接收的Java虚拟机上调用。
使用RMI创建分布式应用
使用RMI开发一个分布式应用,按照下面步骤:
1 设计和实现你的分布式应用的组件
2 编译源码
3 使类网络可访问
4 开启应用
设计和实现分布式应用组件
首先,设计你的应用架构,设计哪些组件是本地对象,哪些是远程可访问的。这个步骤包括:
定义远程接口 一个远程接口指明了能被客户端远程调用的方法。客户端程序到远程接口,不是这些接口的实现类。这样接口的设计,包括了对象类型的确定,将被用作参数并且返回这些方法的值。如果这些接口或方法中的一个还不不存在,你也需要定义好。
实现远程对象 远程对象必须实现一个或者多个远程接口。远程对象可能包括其他的接口和方法的实现,这些只能由本地访问。如果没有本地类用于参数或者这些方法没有返回值,它们也必须实现。
实现客户端 在远程接口定义后,使用远程对象的客户端可以任何时候实现,包括远程对象已经部署后。
编译代码
和许多Java程序一样,你使用javac编译源文件。源文件包括了远程接口,它们的实现类,其他服务器类,和客户端类的申明。
使类网络可访问
在这一步,你得确定类类定义可访问,比如远程接口和它们关联类型的定义和需要下载到客户端和服务器的类的定义。类定义典型的是通过web server使网络可访问。
开启应用
开启这个应用包括运行RMI远程对象注册器,服务器和客户端。
这节剩余部分是创建一个计算引擎。
构建一个通用的计算引擎
这里关注一个简单但强大的分布式应用叫做计算引擎。这个计算引擎是服务器上的远程对象,从客户端获取任务,运行任务并返回值。任务运行在服务器正运行的机器上。这类分布式应用可以大量客户端机器利用了一个独特强大的机器或者已指定硬件的机器。
这个计算引擎的新奇之处是它运行的任务不需要定义,当计算引擎被写或者启动的时候。新类任务可以随时创建并稍后传给计算引擎来运行。一个任务的唯一要求是它的类实现一个特有接口。需要完成任务的代码能被RMI系统下载到这个计算引擎。之后,计算引擎运行那任务,使用计算引擎运行的机器上的资源。
执行任意任务的能力是有Java平台的动态特性提供的,被RMI扩展到网络。RMI动态加载代码到那个计算引擎的Java虚拟机中并且不需要预先不用知道实现任务的类的运行任务。这样的应用,可以动态下载代码的能力,通常被叫做基于行为的应用。这样的应用程序通常需要完整的agent--enabled下部构件。使用RMI,这样的应用程序是Java平台上分布式计算的基本原理部分。