Java Rmi Specification -- Chapter 2 :Distributed Object Model(分布式对象模型)
?
?
原文地址:
?
http://download.oracle.com/javase/1.5.0/docs/guide/rmi/spec/rmi-objmodel.html
?
Chapter 2 :Distributed Object Model(分布式对象模型)
?
2.1 分布式对象应用程序
?
RMI应用程序一般由服务端和客户端组成。一个典型的RMI服务应用程序会创建一些远程对象,使这些远程对象的引用可以被访问,然后等着客户端去调用这些远程对象上的方法。一个典型的RMI客户端会获取一个指向一个或者多个远程对象的引用,然后调用方法。RMI提供一种机制,以实现服务端和客户端的通信和信息的来回传递。这样的应用程序有时候就被称作分布式应用程序。
?
分布式对象应用程序需要具备如下功能:
?
定位远程对象?
应用程序使用两种机制中的一种趋获取远程对象的引用。应用程序可以使用RMI简单命名服务(rmiregistry)注册它的远程对象,或者像正常的操作一样传递和返回远程对象的应用。
?
远程对象之间的通信RMI会处理具体远程对象之间通信的细节;对于程序员来说,远程对象的通信就跟标准的方法调用一样。为传递的参数和返回的值加载类的字节代码因为RMI允许调用者传递对象到远程对象中,所以RMI提供了必要的机制来加载对象的代码下面的图描述了一个RMI分布式程序使用注册去获取远程对象的引用。服务端调用注册模块用名称标识关联远程对象。客户端在服务端的注册器中通过名字标识查找对应的远程对象,然后调用远程对象上的方法。下面的图还显示了RMI系统通过已有的web服务来加载类的字节流代码。RMI可以基于任何java支持的URL协议来加载类的字节码。

2.2 术语定义
在java的分布式对象模型中,remote object 就是一种对象,它的方法能被来自不同的JVM,甚至是不同主机的程序所调用。这种对象必须实现一个或者多个remote接口,remote接口声明了远程对象应该具有的方法。
Remote mothod invocation(RMI) 指的就是调用远程对象上remote接口方法的一种行为。最重要的是,远程对象上的方法调用跟对本地对象进行方法调用有着一样的语法格式。
2.3 分布式和非分布式模型的对比
分布式和非分布式的模型的相同点:远程对象和本地对象的引用在任何方法调用中都能当做方法的参数被传递,或者作为方法执行的结果。远程对象类型能被转换成任何一种它实现的远程接口。内建的instanceof方法都能被用来测试远程对象支持的远程接口。?分布式和非分布式的模型的不同点:远程对象的客户端从来只跟远程对象实现的接口打交道,而不是具体的远程对象类。远程方法调用的时候,参数和返回值是非远程对象(即本地对象),那么传递参数,或者返回方法结果的时候,都是通过复制对象而不是传递引用来实现的。因为传递对象应用只能在单个java虚拟机中起作用。远程对象总是通过引用来传递,而不是复制远程对象的实现。因为远程方法调用的出错模式比本地方法调用来的复杂,所以客户端在进行远程方法调用的时候必须处理更多额外的异常。
2.4 RMI接口和类概述
java.rmi 包中的接口和类实现RMI功能,下面的图展示了这些接口和类的继承关系:

2.4.1 java.rmi.Remote 接口
?
在RMI中, remote接口描述了被远程JVM调用的方法集. remote接口必须满足以下的要求:
?
一个remote接口必须直接或者间接的继承接口java.rmi.Remote。每个remote接口的声明或者其父接口的声明必须满足远程方法声明的要求:1.一个远程方法的声明必须包括 java.rmi.RemoteException异常(或者它的父类如java.io.IOException 或者java.lang.Exception) 在它的抛出源中,此外还要抛出应用程序相关的异常。
2.在远程方法的声明中,在方法的参数中或者返回值中直接或者间接(嵌套在非远程对象中)包含远程对象,那么这个对象必须声明为remote接口,而不是接口的实现类。
?
接口 java.rmi.Remote 只是一个标记型的接口,它没有定义任何的方法:
public interface Remote {}
?
一个远程接口必须至少继承java.rmi.Remote接口(直接或者间接)。然而符合下面条件的情况下,一个远程接口也可以不继承远程接口:
?
远程接口也可以继承只要满足远程方法描述必备的条件的接口。举个例子,下面的BankAccount为访问银行账号定义的一个接口。它包含远程方法:存钱(deposit to the account),查询余额(to get the account balance),取钱(to withdraw from the account):public interface Alpha {public final String okay = "constants are okay too";public Object foo(Object obj)throws java.rmi.RemoteException;public void bar() throws java.io.IOException;public int baz() throws java.lang.Exception;}public interface Beta extends Alpha, java.rmi.Remote {public void ping() throws java.rmi.RemoteException;}?2.4.2?RemoteException类java.rmi.RemoteException是RMI远程方法调用中抛出异常类的父类。为了保证使用RMI的应用程序的健壮性,远程接口中每个远程方法必须在它的抛出源中指定java.rmi.RemoteException(或者是它的父类?java.io.IOException or java.lang.Exception)。远程方法调用失败后,java.rmi.RemoteException将被抛出。远程方法调用失败的原因包括:通信失败(远程服务不可达,或者拒绝连接,或者连接已经被服务关闭,等等)在参数或者返回值的编列或者反编列失败协议错误RemoteException是被检查异常(必须被远程方法调用者处理,在编译的时候被检查),而不是运行时异常。2.4.3?RemoteObject类和它的子类
java.rmi.server.RemoteObject和它的子类java.rmi.server.RemoteServer和java.rmi.server.UnicastRemoteObject和java.rmi.activation.Activatable 提供了RMI服务的功能。
java.rmi.server.RemoteObject提供了java.lang.Object类hashCode, equals, 和toString方法的实现,以支持远程对象的功能。UnicastRemoteObject和Activatable提供了创建远程对象和导出远程对象的方法。这些子类还定义了远程对象引用的语意,例如服务是简单远程对象还是activatable remote object。java.rmi.server.UnicastRemoteObject定义了一个单一的远程对象,该对象只在服务进程活动的时候可用。类java.rmi.activation.Activatable是一个抽象类,它定义了一个activatable远程对象,该对象在方法被调用的时候启动执行并且在必要的时候关闭自身。下一章节 RMI 系统 概述