首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

RMI 規範第七章深度剖析:對象激活機制與持久化遠程引用實現

     編輯:J2EE

激活機制概述:解決長期持久對象的資源難題

分布式系統可能包含成千上萬持久對象,無限期保持所有對象激活將耗盡資源。RMI 激活機制提供:

  • 持久引用:系統崩潰後仍能重建通訊
  • 按需激活:對象僅在首次訪問時啟動(惰性激活)

關鍵術語

  • 活動對象:已在 JVM 中實例化並導出的遠程對象
  • 非活動對象:未實例化但可激活的遠程對象
  • 激活標識符:包含激活對象所需全部信息的持久句柄
  • 不完善引用:Stub 內包含激活標識符 + 瞬態活引用(可能為 null)

惰性激活流程

  1. 調用不完善引用的方法
  2. 檢測活引用為 null → 啟動激活協議
  3. 激活器返回活引用 → 不完善引用「完善」為活引用
  4. 將調用委派給底層遠程引用執行

語義保證:RMI 保持「至多一次」調用語義,失敗時保證遠程方法執行不超過一次。

激活協議核心實體與交互

  • 不完善引用:發起激活請求
  • 激活器:每主機一個,維護激活標識符→描述符映射,管理 JVM 啟動與激活組
  • 激活組:每 JVM 一個,接收激活請求,實例化對象,返回引用
  • 可激活遠程對象:被激活的目標

協議步驟

  1. 不完善引用調用激活器 activate(id, force)
  2. 激活器查找 ActivationDesc(含組 ID、類名、codebase、初始化數據)
  3. 目標激活組存在 → 轉發請求;不存在 → 啟動新 JVM 運行激活組
  4. 激活組加載類,調用特殊構造函數 (ActivationID, MarshalledObject) 實例化對象
  5. 激活組返回編組對象引用 → 激活器緩存映射 → 返回活引用給不完善引用

注意:使用激活需先運行 rmid 守護進程。

可激活遠程對象實現模型

開發者需:

  1. 註冊 ActivationDesc
  2. 在類中提供特殊公共構造函數 (ActivationID, MarshalledObject)

三種註冊方式

  • Activatable.register(ActivationDesc):不創建對象,返回 Stub
  • Activatable 構造函數(前兩種):註冊並導出對象
  • Activatable.exportObject(前兩種):顯式導出已有實現對象

特定對象僅能使用上述三種方式之一註冊。

ActivationDesc 類——激活描述符

包含:組標識符、類名、codebase、編組初始化數據、重啟模式。構造函數支持指定組 ID、重啟模式。getData() 返回 MarshalledObject,激活時傳給構造函數。

ActivationID 類——全局唯一激活標識符

含激活器遠程引用與對象唯一標識符。activate(boolean force) 觸發激活,force=true 忽略緩存強制聯系激活組。

Activatable 類——開發者主 API

抽象類擴展 RemoteServer。四大構造函數:

  • 前兩種:初始構造,註冊並導出(指定 codebase、data、restart、port)
  • 後兩種:激活時調用,僅導出(指定 ActivationID、port)

靜態方法:register、inactive、unregister、多重 exportObject、unexportObject。

構造可激活對象示例

// 擴展 Activatable
public class ServerImpl extends Activatable implements Server {
    // 初始構造
    public ServerImpl(String codebase, MarshalledObject data)
        throws ActivationException, RemoteException {
        super(codebase, data, false, 0); // 匿名端口,非重啟模式
    }
    // 激活構造
    public ServerImpl(ActivationID id, MarshalledObject data)
        throws RemoteException {
        super(id, 0);
        // 利用 data 初始化對象狀態
    }
    public void doImportantStuff() { ... }
}

// 不擴展 Activatable
public class ServerImpl extends SomeClass implements Server {
    public ServerImpl(String codebase, MarshalledObject data) throws ... {
        Activatable.exportObject(this, codebase, data, false, 0);
    }
    public ServerImpl(ActivationID id, MarshalledObject data) throws ... {
        Activatable.exportObject(this, id, 0);
    }
    ...
}

不創建對象註冊描述符

ActivationDesc desc = new ActivationDesc("examples.ServerImpl", codebase, data);
Server server = (Server) Activatable.register(desc); // 返回 Stub

激活系統核心接口

Activator 接口——激活請求入口

public interface Activator extends Remote {
    MarshalledObject activate(ActivationID id, boolean force)
        throws UnknownObjectException, ActivationException, RemoteException;
}

激活器緩存活動對象映射,force=false 時直接返回緩存引用。組不存在時啟動新 JVM(傳遞組描述符、化身號)。返回 MarshalledObject 避免加載對象代碼、不參與 DGC。

ActivationSystem 接口——註冊管理

  • registerGroup/Object:註冊組/對象描述符,返回 ID
  • activeGroup:組回調通知已激活,返回 ActivationMonitor
  • unregisterGroup/Object、shutdown:註銷與關閉

安全限制:遠程調用上述方法拋出 AccessException。

ActivationMonitor 接口——狀態監控

  • inactiveObject(id):對象非活動,標記引用過期,下次激活重新實例化
  • activeObject(id, mobj):對象激活,通知監控器
  • inactiveGroup(id, incarnation):組非活動,下次用更大化身號重建

ActivationInstantiator 接口——對象實例化

public interface ActivationInstantiator extends Remote {
    MarshalledObject newInstance(ActivationID id, ActivationDesc desc)
        throws ActivationException, RemoteException;
}

激活組實現此接口:加載類 → 調用特殊構造函數 → 返回編組對象引用。負責報告對象非活動(調用監控器 inactiveObject)。

ActivationGroup 類——激活組實現基類

擴展 UnicastRemoteObject 實現 ActivationInstantiator。核心方法:

  • createGroup(id, desc, incarnation):創建/設置組,回調 activeGroup 獲取監控器
  • newInstance:實例化對象(加載類、調用特殊構造函數)
  • inactiveObject:取消導出對象,通知監控器
  • activeObject/inactiveGroup:受保護方法供子類回調監控器

默認設置 RMISecurityManager、強制系統屬性。自定義組需在構造函數設置 SecurityManager。

MarshalledObject 類——延遲反序列化容器

封裝可序列化對象,延遲至調用 get() 時反序列化。序列化時註解 codebase URL,反序列化時自動下載缺失類。遠程對象以 Stub 形式存儲。equals/hashCode 忽略 codebase 註解比較序列化內容等價性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved