在 CORBA 架構中,伺服端物件 (Servant) 與 CORBA 物件 (Object Reference) 的綁定時機,直接決定了物件啟動策略、資源管理與延展性。本文深入剖析 早期綁定** 與 **後期綁定** 的觸發條件、生命週期流程、優劣權衡與適用場景。
由**應用程式邏輯主動發起**,典型場景為工廠模式:
// 伺服端工廠方法
public ObjectRef createObject() {
Servant servant = new ConcreteServant(); // 1. 建立 Servant
byte[] oid = generateObjectId(); // 2. 產生 ObjectId
poa.activate_object_with_id(oid, servant); // 3. 早期綁定:在 POA 中註冊
return poa.id_to_reference(oid); // 4. 回傳物件參考給客戶端
}
由**ORB 執行階段在物件故障** 時被動觸發:
ServantManager` (實作 `ServantActivator` 或 `ServantLocator`)。POA.activate_object_with_id()` 完成綁定。| 模式 | 介面 | 綁定壽命 | 適用場景 |
|---|---|---|---|
| **非保留** | `ServantActivator` | 僅當前請求期間 | 無狀態物件、大量輕量物件、記憶體敏感環境 |
| **保留** | `ServantLocator` | 跨請求持久 (直到 `deactivate`) | 有狀態物件、資料庫連線池、快取物件 |
| 維度 | 早期綁定 | 後期綁定 |
|---|---|---|
| 啟動延遲 | 零 (首次呼叫前已就緒) | 首次呼叫額外負擔 (ServantManager 邏輯) |
| 記憶體佔用 | 常駐 | 按需載入,可釋放 |
| 擴展性 | 受限於預建立數量 | 支援海量稀疏存取物件 |
| 故障恢復 | 需應用層重建 | ORB 自動透過 ServantManager 恢復 |
| 實作複雜度 | 低 (直接 activate) | 高 (需實作 ServantManager 介面) |
| 典型政策 | `RETAIN` + ` | `RETAIN` + ` |
// 早期綁定政策組合
Policy[] policies = new Policy[] {
poa.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID),
poa.create_lifespan_policy(LifespanPolicyValue.PERSISTENT),
poa.create_request_processing_policy(RequestProcessingPolicyValue.USE_ACTIVE_OBJECT_MAP_ONLY),
poa.create_servant_retention_policy(ServantRetentionPolicyValue.RETAIN)
};
POA earlyPOA = rootPOA.create_POA("EarlyBindingPOA", null, policies);
// 後期綁定 (保留模式) 政策組合
Policy[] latePolicies = new Policy[] {
poa.create_id_assignment_policy(IdAssignmentPolicyValue.SYSTEM_ID),
poa.create_lifespan_policy(LifespanPolicyValue.PERSISTENT),
poa.create_request_processing_policy(RequestProcessingPolicyValue.USE_SERVANT_MANAGER),
poa.create_servant_retention_policy(ServantRetentionPolicyValue.RETAIN)
};
POA latePOA = rootPOA.create_POA("LateBindingPOA", null, latePolicies);
// 需註冊 ServantLocator: latePOA.set_servant_manager(new MyServantLocator());
理解綁定時機與 POA 政策交互,是設計高效、可擴展 CORBA 系統的關鍵鑰匙。