原文地址:
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)注册它的远程对象,或者像正常的操作一样传递和返回远程对象的应用。
- 远程对象之间的通信
- 为传递的参数和返回的值加载类的字节代码
- 远程对象和本地对象的引用在任何方法调用中都能当做方法的参数被传递,或者作为方法执行的结果。
- 远程对象类型能被转换成任何一种它实现的远程接口。
- 内建的instanceof方法都能被用来测试远程对象支持的远程接口。
- 远程对象的客户端从来只跟远程对象实现的接口打交道,而不是具体的远程对象类。
- 远程方法调用的时候,参数和返回值是非远程对象(即本地对象),那么传递参数,或者返回方法结果的时候,都是通过复制对象而不是传递引用来实现的。因为传递对象应用只能在单个java虚拟机中起作用。
- 远程对象总是通过引用来传递,而不是复制远程对象的实现。
- 因为远程方法调用的出错模式比本地方法调用来的复杂,所以客户端在进行远程方法调用的时候必须处理更多额外的异常。
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接口(直接或者间接)。然而符合下面条件的情况下,一个远程接口也可以 不继承远程接口:
- 远程接口也可以继承只要满足远程方法描述必备的条件的接口。
public interface BankAccount extends java.rmi.Remote {
public void deposit(float amount)
throws java.rmi.RemoteException;
public void withdraw(float amount)
throws OverdrawnException, java.rmi.RemoteException;
public float getBalance()
throws java.rmi.RemoteException;
}
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;
}
java.rmi.RemoteException是RMI远程方法调用中抛出异常类的父类。为了保证使用RMI的应用程序的健壮性,远程接口中每个远程方法必须在它的抛出源中指定
java.rmi.RemoteException(或者是它的父类
java.io.IOException
or
java.lang.Exception
)。
- 通信失败(远程服务不可达,或者拒绝连接,或者连接已经被服务关闭,等等)
- 在参数或者返回值的编列或者反编列失败
- 协议错误
RemoteException是被检查异常(必须被远程方法调用者处理,在编译的时候被检查),而不是运行时异常。
-
java.rmi.server.RemoteObject提供了
java.lang.Object类
hashCode
,equals
, 和toString方法的实现,以支持远程对象的功能。
-
UnicastRemoteObject和
Activatable提供了创建远程对象和导出远程对象的方法。这些子类还定义了远程对象引用的语意,例如服务是简单远程对象还是activatable remote object。
java.rmi.server.UnicastRemoteObject定义了一个单一的远程对象,该对象只在服务进程活动的时候可用。
-
类
java.rmi.activation.Activatable是一个抽象类,它定义了一个
activatable远程对象,该对象在方法被调用的时候启动执行并且在必要的时候关闭自身。