原文地址:
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)注册它的远程对象,或者像正常的操作一样传递和返回远程对象的应用。
2.4.1 java.rmi.Remote 接口
在RMI中, remote接口描述了被远程JVM调用的方法集. 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远程对象,该对象在方法被调用的时候启动执行并且在必要的时候关闭自身。