RMI規範(9)

第 9 章

本章中的接口和類用於 RMI 的分佈式垃圾收集器 (DGC)。

主題:
接口 DGC
Lease 類
ObjID 類
UID 類
VMID 類
9.1 接口 DGC
DGC 抽象用於分佈式垃圾收集算法的服務器端。此接口包含兩種方法:dirty 和
clean。當遠程引用在客戶機(客戶機由 VMID 表示)端解編時,將調用 dirty
。當客戶機中不再存在對遠程引用的引用時,將進行相應的清理調用。失敗的 d
irty 調用必須預定一次 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 添加到 i
ds 中指示的每個遠程對象的引用列表中。sequenceNum 用來檢測和丟棄後期垃圾
收集器調用的順序號。每次調用垃圾收集器,順序號都將增大。

某些客戶機不能生成唯一的 VMID。這是因爲只有當 VMID 包含 true(真)主機
地址時,纔是通用的唯一標識符。由於安全性限制,某些客戶機將無法獲得該地
址。此種情況下,客戶機可以使用空 VMID。分佈式垃圾收集器將爲客戶機指派
VMID。

dirty 調用將返回 Lease 對象,其中包含遠程引用所用的 VMID 和准許的租用期
(服務器可以決定授予比客戶機請求短的租用期)。客戶機必須使用垃圾收集器
所用的 VMID,以便在客戶機釋放遠程對象引用時進行相應的 clean 調用。

客戶虛擬機僅需對每個虛擬機中引用的遠程引用進行一次初始 dirty 調用(即使
它對同一遠程對象進行多次引用)。此外,客戶機還必須在租用到期前調用 dir
ty 對遠程引用的租用進行續租。當客戶機對特定的遠程對象再無任何引用時,必
須爲與該引用關聯的對象 ID 預定一次 clean 調用。

clean 調用將從 ids 指定的遠程對象的引用列表中刪除 vmid。順序號用來檢測
以後的清理操作。如果參數 strong 爲真,則代表 clean 調用是一次失敗的 di
rty 調用的結果。此時應記住客戶機 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 來自非本地
地址空間時,地址空間標識符纔將含在字符串表示法中。

.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,其內容將從指定輸入流中讀取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章