快捷搜索:

RMI规范--第八章

本章包孕 rmic stub 编译器天生的 stub 和 skleton 所用的接口和类。

主题:

RemoteStub 类

RemoteCall 接口

RemoteRef 接口

ServerRef 接口

Skeleton 接口

Operation 类

8.1 RemoteStub 类

java.rmi.server.RemoteStub 类是远程工具 stub 的通用超类。stub 工具是一

种代理,它支持的远程接口集与远程工具的实际实现所定义的完全相同。

package java.rmi.server;

public abstract class RemoteStub extends java.rmi.RemoteObject

{

protected RemoteStub();

protected RemoteStub(RemoteRef ref);

protected static void setRef(RemoteStub stub, RemoteRef ref);

}

RemoteStub 的第一个构造函数将创建带有空远程引用的 stub。第二个构造函数

将创建带有给定远程引用 ref 的 stub。

JDK1.2 中不鼓励应用(且不支持)setRef 措施。

8.1.1 远程工具与 stub 类的类型等价性

客户机可与 stub(代理)工具进行交互,该 stub 的远程接口集与远程工具类所

定义的完全相同。因为 stub 类是由实现一个或多个远程接口的实现类英华所生

成的,是以 stub 类不包括类层次(组成工具的类型图)的非远程部分。例如,

假如 C 扩展 B 而 B 扩展 A,但只有 B 实现远程接口,则 stub 将由 B 天生,

而非 C。

因为 stub 实现与远程工具类相同的远程接口集,是以从 Java 系统的角度看,

stub 拥有与办事器工具类型图的远程部分相同的类型。这样,客户机即可使用内

置 Java 操作来反省远程工具的类型,同时也可从一个远程接口向另一远程接口

进行强制类型转换。

stub 是用 rmic 编译器天生的。

8.1.2 声明为终态的工具措施的语义

以下措施在 java.lang.Object 类中被声明为终态 final,是以不能被随意率性实现

所覆盖:

getClass

notify

notifyAll

wait

getClass 的缺省实现适用于所有 Java 工具(本地或远程);对付远程工具,该

措施不必要专门的实现。getClass 措施在远程 stub 上应用时,它申报由 rmic

天生的 stub 工具切实着实切类型。留意,stub 类型仅反应远程工具实现的远程接

口,而非本地接口。

java.lang.Object 的 wait 和 notify 措施将处置惩罚 Java 说话线程模型高低文中

的等待和看护。虽然对远程 stub 应用这些措施不会违反 Java 线程模型,但这

些措施的语义将与用于本地 Java 工具时的语义不合。尤其,应用这些措施时所

操作的将是远程工具的客户机本地引用 (stub),而不是远程站点的实际工具。

8.2 RemoteCall 接口

RemoteCall 是远程工具的 stub 和 skeleton 所用的抽象接口,用来履行对远程

工具的调用。

----------------------------------------------------------------------

----------

留意 - JDK 1.2 中不鼓励应用 RemoteCall 接口。JDK 1.2 stub 协议也已不再

应用此接口。现在,stub 在 JDK 1.2 中应用新的 invoke 措施,该措施不必要

将 RemoteCall 作为参数。

----------------------------------------------------------------------

----------

package java.rmi.server;

import java.io.*;

public interface RemoteCall

{

ObjectOutput getOutputStream() throws IOException;

void releaseOutputStream() throws IOException;

ObjectInput getInputStream() throws IOException;

void releaseInputStream() throws IOException;

ObjectOutput getResultStream(boolean success)

throws IOException, StreamCorruptedException;

void executeCall() throws Exception;

void done() throws IOException;

}

措施 getOutputStream 返回输出流。stub 将把参数编组到此中,或者 skeleton

将把结果编组到此中。

措施 releaseOutputStream 开释输出流。在某些传输中,这将导致开释流。

措施 getInputStream 返回 InputStream。stub 从中解编结果,或者 skeleton

从中解编参数。

措施 releaseInputStream 开释输入流。这将容许某些传输提前开释连接的输入

端。

措施 getResultStream 返回输出流(写完与调用成功有关的标题信息后)。每次

远程调用将只能得到一次结果流。假如 success 为真,则要编组的结果属于正常

返回;否则结果为非常。假如已得到该远程调用的结果流,则抛出

StreamCorruptedException。

措施 executeCall 尽其所能履行调用。

措施 done 容许完生远程调用落后行清除。

.3 RemoteRef 接口

接口 RemoteRef 表示远程工具的句柄。每个 stub 均包孕 RemoteRef 的一个实

例,此中包孕引用的详细表示。该远程引用将用来在其代表的远程工具上履行远

程调用。

package java.rmi.server;

public interface RemoteRef extends java.io.Externalizable

{

Object invoke(Remote obj,

java.lang.reflect.Method method,

Object[] params,

long opnum)

throws Exception;

RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum, long hash)

throws RemoteException;

void invoke(RemoteCall call) throws Exception;

void done(RemoteCall call) throws RemoteException;

String getRefClass(java.io.ObjectOutput out);

int remoteHashCode();

boolean remoteEquals(RemoteRef obj);

String remoteToString();

}

第一个 invoke 措施将措施调用代理给 stub (obj) 的远程引用,并容许引用负

责建立对远程主机的连接,将 method 和参数 params 的一些表示进行编组,然

后应用措施调用与远程主机进行通讯。该措施将返回驻留在远程主机上的远程对

象的措施调用结果,或者在调用掉败时抛出 RemoteException,而在远程调用抛

出非常时则抛出利用法度榜样级非常。留意,操作号 opnum 表示一散列措施署名,可

以用来对要传输的措施进行编码。

opnum 的措施散列是一个 64 位(长)整数,是根据美国国家标准技巧局 (NIST

) 的安然散列算法 (SHA-1),用字撙节消息择要的前两个 32 位值谋略而来的。

字撙节包孕由远程措施名后跟其措施描述符组成的字符串的 UTF 编码(有关措施

描述符的阐明,拜见 Java 虚拟机规范的第 4.3.3 节)。散列值将从 SHA-1 散

列的第一个和第二个 32 位值获得。

long hash = sha[1] << 32 + sha[0]

----------------------------------------------------------------------

----------

留意 - JDK 1.2 中不鼓励应用 newCall、invoke 和 done 措施。rmic 用 JDK

1.2 stub 协议版本天生的 stub 不再应用这些措施。由 newCall、invoke 和 d

one 组成的调用序列已被新的 invoke 措施所调换,该新措施将 Method 工具作

为一个参数。

----------------------------------------------------------------------

----------

措施 newCall 将为远程工具 obj 上的新远程措施调用创建响应的调用工具。操

作数组 op 包孕远程工具上的可用操作。操作号 opnum 是对操作数组的索引,它

指定该远程调用的特定操作。 通报操作数组和索引可使 stub 天生器能分派操作

索引并进行解释。远程引用可能必要操作阐明以在调用中进行编码。

措施 invoke 认真履行远程调用。invoke 将孕育发生能顺利经由过程而不被 stub 捕获的

“用户”非常。假如在远程调用历程中孕育发生非常,则 invoke 应留意在孕育发生“用

户非常”或 RemoteException 之前清除连接。

措施 done 容许远程引用清除(或从新应用)连接。只有当 invoke 调用已成功

地(非非常)返回 stub 时,才应调用 done。

措施 getRefClass 返回将被序列化到流 out 上的引用类型的非包限制的类全名

措施 remoteHashCode 返回远程工具的散列码。两个引用相同远程工具的远程对

象 stub 将有相同的散列码(以支持在散列表中将远程工具作为键值)。Remote

Object 将把对其 hashCode 措施的调用转发给远程引用的 remoteHashCode 措施

措施 remoteEquals 对照两个远程工具的等价性。假如两个远程工具引用相同的

远程工具,即觉得它们等价。例如,假如两个 stub 引用相同的远程工具,则认

为它们等价。 RemoteObject 将把对其 equals 措施的调用转发给远程引用的 r

emoteEquals 措施。

措施 remoteToString 返回表示该远程工具的引用的 String。

8.4 ServerRef 接口

接口 ServerRef 表示远程工具实现的办事器端句柄。

package java.rmi.server;

public interface ServerRef extends RemoteRef {

RemoteStub exportObject(java.rmi.Remote obj, Object data")" tppabs="http://www.chinajavaworld.com/doc/rmi_iiop/%29"

throws java.rmi.RemoteException;

String getClientHost() throws ServerNotActiveException;

}

措施 exportObject 将为所供给的 Remote 工具实现 obj 查找或创建客户机 st

ub 工具。参数 data 包孕导出工具所需的信息(如端口号)。

措施 getClientHost 返回当前客户机的主机名。当它被当前正在处置惩罚远程工具调

用的线程调用时,将返回履行此调用的客户机主机名。假如当前某一远程措施调

用未处于办事状态,则调用 ServerNotActiveException。

8.5 Skeleton 接口

接口 Skeleton 仅能由 rmic 编译器所天生 skeleton 的实现。远程工具的 ske

leton 是办事器真个实体,它将为实际远程工具实现分配调用。

----------------------------------------------------------------------

----------

留意 - JDK1.2 中不鼓励应用 Skeleton 接口。每个由 rmic stub 编译器天生的

1.1(以及在 1.2 中由缺省 rmic -vcompat 天生的兼容 1.1 的 skeleton)sk

eleton 类均实现该接口。JDK1.2 兼容版本平分配远程措施调用将不再必要 ske

leton。要天生兼容 JDK1.2 或更高版本的 stub,请应用带有选项 -v1.2 的敕令

rmic。

----------------------------------------------------------------------

----------

package java.rmi.server;

public interface Skeleton

{

void dispatch(Remote obj, RemoteCall call, int opnum, long hash)

throws Exception;

Operation[] getOperations();

}

dispatch 措施将解编 call 工具中得到的输入流中的参数,调用实际远程工具实

现 obj 上的措施(由操作号 opnum 表示),然后将返回值进行编组。假如在调

用历程中发生非常,则抛出非常。

getOperations 措施返回包孕远程工具措施的操作描述符的数组。

8.6 Operation 类

类 Operation 包孕对远程工具 Java 措施的阐明。

----------------------------------------------------------------------

----------

留意 - JDK 1.2 中不鼓励应用 Operation 接口。JDK 1.2 stub 协议不再应用原

有的、以 Operation 作为参数的 RemoteRef.invoke 措施。stub 在 JDK 1.2 中

应用了新的 invoke 措施,它不再必要将 Operation 作为参数。

----------------------------------------------------------------------

----------

package java.rmi.server;

public class Operation

{

public Operation(String op);

public String getOperation();

public String toString();

}

构造 Operation 工具时平日带有措施署名。

措施 getOperation 返回操作描述符的内容(其初始化时应用的值)。

措施 toString 也返回操作描述符的字符串表示(平日为措施署名)。

您可能还会对下面的文章感兴趣: