发信人: daystream()
整理人: biubiu(2000-01-02 15:22:43), 站内信件
|
主题:
Stub 与 skeleton
远程方法调用中的线程使用
远程对象的垃圾收集
动态类的加载
通过代理服务器透过防火墙的 RMI
3.1 Stub 与 skeleton
在与远程对象的通信过程中,RMI 将使用标准机制(用于 RPC 系统):stub
与 skeleton。远程对象的 stub 担当远程对象的客户本地代表或代理人角色。
调用程序将调用本地 stub 的方法,而本地 stub 将负责执行对远程对象的方
法调用。在 RMI 中,远程对象的 stub 与该远程对象所实现的远程接口集相同。
调用 stub 的方法时,将执行下列操作:
初始化与包含远程对象的远程虚拟机的连接。
对远程虚拟机参数的进行编组(写入并传输)
等待方法调用结果
解编(读取)返回值或返回的异常
将值返给调用程序
为向调用程序展示比较简单的调用机制,stub 将参数的序列化和网络级通信隐
藏了起来。
在远程虚拟机中,每个远程对象都可以有相应的 skeleton(纯 JDK1.2 环境中
不需要 skeleton)。skeleton 负责将调用分配给实际的远程对象实现。它在
接收入进入方法调用时执行下列操作:
解编(读取)远程方法的参数
调用实际远程对象实现上的方法
将结果(返回值或异常)编组(写入并传输)给调用程序
由于推出于 JDK1.2 及附加的 stub 协议,使得在纯 JDK1.2 环境中无需使用
skeleton。相反,应使用通用代码代替 JDK1.1 中的 skeleton 履行其职责。
stub 和 skeleton 由 rmic 编译器生成。
3.2 远程方法调用中的线程使用
RMI 运行时分配给远程对象实现的方法可能在也可能不在独立的线程中执行。
RMI 运行时将无法担保远程对象与线程的映射关系。因为同一个远程对象的远程
方法调用可能会同时执行,所以远程对象实现需确保其实现是线程安全的。
3.3 远程对象的垃圾收集
与在本地系统中相同,在分布式系统中自动删除那些不再被任何客户机引用的远
程对象是令人满意的。这可以将程序员从跟踪远程对象客户机以便适时终止的任
务中解脱出来。RMI 使用与 Modula-3 网络对象相似的引用计数的垃圾收集算
法(参见 1994 年 5 月数字设备公司系统研究中心技术报告 115 中 Birrell、
Nelson 和 Owicki 的“网络对象”)。
要实现引用计数垃圾收集,RMI 运行时需要跟踪每个 Java 虚拟机内的所有活
动引用。当活动引用进入 Java 虚拟机时,其引用计数将加 1。首次引用某对
象时会向该对象的服务器发送“referenced”消息。当发现活动引用在本地虚
拟机中并未被引用时,该数将减 1。放弃最后的引用时,未被引用的消息将被发
送到服务器。协议中存在很多微妙之处,其中大部分都与维护引用或未引用消息
的次序有关,可确保对象不被过早地收集。
当某远程对象不被任何客户机所引用时,RMI 运行时将对其进行弱引用。如果不 存在该
对象的其它本地引用,则弱引用将允许 Java 虚拟机的垃圾收集器放弃该对象。
通过保持对对象的常规引用或弱引用,分布式垃圾收集算法可与本地 Java 虚拟
机的垃圾收集器以常规方式进行交互。
只要存在对远程对象的本地引用,就不能将远程对象当作垃圾进行收集,而且该
远程对象也可在远程调用中传送或返回客户机。传递远程对象也将同时把目标虚
拟机的标识符添加到被引用集中。需要未引用通知的远程对象必须实现
java.rmi.server.Unreferenced 接口。当这些引用不再存在时,将调用
unreferenced 方法。当发现引用集为空时,也将调用 unreferenced。因此,
unreferenced 方法可能会被多次调用。只有当没有本地和远程引用时,才可收集 远程对象。
注意,如果在客户机和远程服务器对象之间存在网络分区,则可能会过早地收集
、远程对象(因为传输可能认为客户机已失效)。由于可能会出现过早收集的现
象,因此远程引用将不能保证引用的完整性。换句话说,远程引用实际上可能指
向不存在的对象。使用此类引用时将抛出必须由应用程序处理的 RemoteExcepti on。
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.191.124]
|
|