`
huxiaojun_198213
  • 浏览: 101114 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

RMI规范--第九章

    博客分类:
  • RMI
阅读更多
本章中的接口和类用于 RMI 的分布式垃圾收集器 (DGC)。

主题:

接口 DGC
Lease 类
ObjID 类
UID 类
VMID 类

9.1 接口 DGC

DGC 抽象用于分布式垃圾收集算法的服务器端。此接口包含两种方法:dirty和clean。

当远程引用在客户机(客户机由 VMID 表示)端解编时,将调用 dirty。当客户机中不再存在对远程引用的引用时,将进行相应的清理调用。

失败的dirty调用必须预定一次 strong(强)clean 调用,以便保留调用顺序号码,从而检测以后由分布式垃圾收集器接收的无序调用。

对远程对象的引用将被拥有该引用的客户机租用 (leased) 一段时间。租用期从接收到 dirty 调用时开始。

客户机必须在租用到期前在其所保存的远程引用上再次调用 dirty,以便进行续租。

如果在到期之前不续租,则分布式垃圾收集器就认为该客户机不再引用远程对象。

package java.rmi.dgc; 

import java.rmi.server.ObjID; 

public interface DGC extends java.rmi.Remote{ 

Lease dirty(ObjID[] ids, long sequenceNum, Lease lease)throws java.rmi.RemoteException; 

void clean(ObjID[] ids, long seqNum, VMID vmid, boolean strong)throws java.rmi.RemoteException; 

} 


方法 dirty 请求租用与数组参数 ids 中所含对象标识符相关联的远程对象引用。lease 包含客户机唯一虚拟机标识符 (VMID) 和请求的租用期。

垃圾收集器将为每个本地虚拟机中导出的远程对象保留一个 reference list(引用列表)-- 保存引用的客户机列表。

如果准予租用,垃圾收集器将把客户机 VMID 添加到 ids 中指示的每个远程对象的引用列表中。sequenceNum 用来检测和丢弃后期垃圾收集器调用的顺序号。

每次调用垃圾收集器,顺序号都将增大。某些客户机不能生成唯一的 VMID。这是因为只有当 VMID 包含 true(真)主机地址时,才是通用的唯一标识符。

由于安全性限制,某些客户机将无法获得该地址。此种情况下,客户机可以使用空 VMID。分布式垃圾收集器将为客户机指派VMID。

dirty 调用将返回 Lease 对象,其中包含远程引用所用的 VMID 和准许的租用期(服务器可以决定授予比客户机请求短的租用期)。

客户机必须使用垃圾收集器所用的 VMID,以便在客户机释放远程对象引用时进行相应的 clean 调用。

客户虚拟机仅需对每个虚拟机中引用的远程引用进行一次初始 dirty 调用(即使它对同一远程对象进行多次引用)。

此外,客户机还必须在租用到期前调用 dirty 对远程引用的租用进行续租。当客户机对特定的远程对象再无任何引用时,必须为与该引用关联的对象 ID 预定一次 clean 调用。

clean 调用将从 ids 指定的远程对象的引用列表中删除 vmid。顺序号用来检测以后的清理操作。

如果参数 strong 为真,则代表 clean 调用是一次失败的 dirty 调用的结果。此时应记住客户机 vmid 的顺序号。

9.2 Lease 类

租用包含一个唯一的虚拟机标识符和一个租用期。Lease 对象用来请求及准予对远程对象引用的租用。


package java.rmi.dgc; 

public final class Lease implements java.io.Serializable{ 

  public Lease(VMID id, long duration); 

  public VMID getVMID(); 

  public long getValue(); 
} 


Lease 构造函数创建带有特定 VMID 和租用期的租用。VMID 可以为 null。

getVMID 方法返回与租用相关联的客户机 VMID。

getValue 方法返回租用期。

9.3 ObjID 类

类 ObjID 用来作为虚拟机中对远程对象的唯一标识。每个标识符均包含一个对象号和一个特定主机上的唯一地址空间标识符。

对象标识符将在导出远程对象时指派给该对象。

ObjID 由对象号 (long) 和地址空间的唯一标识符 (UID) 组成。

package java.rmi.server; 

public final class ObjID implements java.io.Serializable{ 

public ObjID (); 

public ObjID (int num); 

public void write(ObjectOutput out) throws java.io.IOException; 

public static ObjID read(ObjectInput in)throws java.io.IOException; 

public int hashCode()

public boolean equals(Object obj) 

public String toString() 

} 


ObjID 构造函数的第一种形式将生成唯一的对象标识符。

第二个构造函数生成已知的对象标识符(例如注册服务程序和分布式垃圾收集器所用的标识符),并将已知的对象号用作参数。

第二个构造函数所生成的已知对象 ID 与缺省构造函数所生成的对象 ID 不冲突;

为强制实现这一点,ObjID 的对象号将被设置为构造函数中提供的“已知”号,同时所有 UID 域均将设置为零。

方法 write 将对象 ID 的表示法编组到输出流中。

方法 read 构造一个对象 ID,其内容将从指定的输入流中读取。

方法 hashCode 将对象号作为 hashcode 返回。

如果 obj 与 ObjID 内容相同,则 equals 方法返回 true。

toString 方法返回一个包含对象 ID 表示法的字符串。仅当对象 ID 来自非本地地址空间时,地址空间标识符才将含在字符串表示法中。

9.4 UID 类

UID 是一种抽象类,用来创建生成它的主机的唯一标识符。它将以地址空间标识符的形式含在 ObjID 中。

UID 由一个在主机上唯一的号码 (int)、时间 (long)和计数组成 (short)。


package java.rmi.server; 

public final class UID implements java.io.Serializable{ 

public UID(); 

public UID(short num); 

public int hashCode(); 

public boolean equals(Object obj); 

public String toString(); 

public void write(DataOutput out) throws java.io.IOException; 

public static UID read(DataInput in) throws java.io.IOException; 

} 



构造函数的第一种形式将创建生成它的主机的唯一纯标识符。此 UID 在以下条件下具有唯一性:

a) 计算机需要一秒以上的时间进行重新启动,b) 计算机的时钟将永不向前调整。为了构造全局唯一的 UID,只需将UID与InetAddress分别配对。

构造函数的第二种形式将创建一种已知的 UID。已知 ID 有 216 -1 种可能。这 种构造函数所生成的 ID 不会与缺省 UID 构造函数所生成的 ID 冲突。

缺省构造函数生成主机上真正唯一的标识符。

方法 hashCode、equals 和 toString 是为 UID 所定义的。如果两个 UID 的内容相同,则视为二者等价。

方法 write 将把 UID 写入输出流中。

方法 read 构造一个 UID,其内容将从指定输入流中读取。  
分享到:
评论

相关推荐

    第15章 复习的重点和内容课件

    本复习资料主要针对第15章的内容,涵盖了分布式程序设计的期末考试重点,主要包括Java EE的基本概念和体系结构、JSF开发以及EJB应用的基础知识。复习内容详细列举了可能出现在考试中的题型,如判断题、选择题、填空...

    JMX1.4 规范 翻译 第一章(介绍)(至1.6节)

    Java Management Extensions(JMX)1.4规范是Java平台中用于管理系统和应用程序的重要技术。它提供了管理和监控Java应用程序、设备和服务的标准框架。本章节主要介绍了JMX的基本概念、架构以及核心组件。 ### 1. ...

    JAVA编程技术教学大纲.

    ### 第9章 JavaBean和RMI - **内容概览**:介绍JavaBean基础、开发简介,RMI基础及EJB规范简介。 - **教学要求**:学生应理解JavaBean基础。 - **重点与难点**:重点在于JavaBean和RMI基础;难点在于JavaBean开发...

    JSP高级编程(全)

    第9 章 JDBC 2.0/3.0 API 的新特性 9.1 JDBC API 2.0 的新特性 9.2 JDBC API 2.0 简介 9.3 JDBC API 3.0 简介 9.4 附录JDBC 数据类型和Java 数据类型的映射关系 9.5 本章小结 第10 章 JDBC Optional Package 10.1 ...

    Java网络高级编程

    第9章则聚焦于利用WebLogic服务器的EJB(Enterprise JavaBeans)技术,EJB是一种用于开发企业级应用的组件架构。 第10章的内容是Java安全体系结构,包括密钥、消息摘要、数字签名、访问控制、安全套接口SSL、主体...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    第9章 消息驱动EJB 346 9.1 JMS和EJB 347 9.1.1 为什么使用MDB 347 9.1.2 使用MDB的设计原则 348 9.2 使用消息驱动Bean 349 9.2.1 使用@MessageDriven和@ActivationConfigProperty 350 9.2.2 实现MessageListener ...

    Thinking in Java 中文第四版+习题答案

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException的特殊情况 ...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException的特殊情况 ...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException的特殊情况 ...

    Think in Java(中文版)chm格式

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException...

    Java初学者入门教学

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException的特殊情况 ...

    JAVA_Thinking in Java

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException的特殊情况 ...

    ThinkInJava

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException的特殊情况 ...

    java 编程入门思考

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException的特殊情况 ...

    thinkinjava

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException的特殊情况 ...

    Thinking in Java简体中文(全)

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException的特殊情况 ...

    java联想(中文)

    第9章 违例差错控制 9.1 基本违例 9.1.1 违例自变量 9.2 违例的捕获 9.2.1 try块 9.2.2 违例控制器 9.2.3 违例规范 9.2.4 捕获所有违例 9.2.5 重新“掷”出违例 9.3 标准Java违例 9.3.1 RuntimeException的特殊情况 ...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 9.3.1 添加CVS资源库 9.3.2 提交和更新代码 9.4 小结 第三篇 J2EE开发...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 9.3.1 添加CVS资源库 9.3.2 提交和更新代码 9.4 小结 第三篇 J2EE开发...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 9.3.1 添加CVS资源库 9.3.2 提交和更新代码 9.4 小结 第三篇 J2EE开发...

Global site tag (gtag.js) - Google Analytics