CORBA 對象生命週期管理是分布式對象技術的核心難點。本文系統梳理 BOA(基本對象適配器)時代 到 POA(可移植對象適配器)時代 的架構演進,剖析請求處理流程、線程策略、對象激活/去激活、攔截器機制,揭示生命週期事件順序的本質複雜性。
receive_message()target_invoke() → DII invoke()result() 檢查結果 → send_message() 發送響應receive_message()invoke() 閻塞等待響應PortableServer 模塊定義標準 POA 接口,實現可移植PortableInterceptor 規範,支持請求/消息/ IOR 攔截| 策略類別 | 關鍵選項 | 影響 |
|---|---|---|
| 線程模型 | ORB_CTRL_MODEL / SINGLE_THREAD_MODEL | ORB 控制線程池 vs 單線程串行 |
| 對象 ID | USER_ID / SYSTEM_ID | 應用指定 vs POA 自動生成 |
| 生命週期 | TRANSIENT / PERSISTENT | 進程存活 vs 跨進程持久化 |
| 請求處理 | USE_ACTIVE_OBJECT_MAP_ONLY / USE_DEFAULT_SERVANT / USE_SERVANT_MANAGER | 預激活映射 / 默認服務對象 / 動態激活管理器 |
| 隱含激活 | IMPLICIT_ACTIVATION / NO_IMPLICIT_ACTIVATION | 首次請求自動激活 vs 顯式激活 |
POA::create_reference() / POA::create_reference_with_id() 生成 IORPOA::activate_object() / POA::activate_object_with_id() 關聯 ServantPOA::deactivate_object() 解除關聯,Servant 可被 GCPOA::destroy() 遞歸銷毀 POA 及子 POA// 用於 USE_SERVANT_MANAGER 策略
public interface ServantActivator extends ServantManager {
Servant incarnate(byte[] oid, POA adapter) throws ForwardRequest;
void etherealize(byte[] oid, POA adapter, Servant serv,
boolean cleanupOn, boolean remainingActivations);
}
public interface ServantLocator extends ServantManager {
Servant preinvoke(byte[] oid, POA adapter, String operation, CookieHolder cookie)
throws ForwardRequest;
void postinvoke(byte[] oid, POA adapter, String operation, CookieHolder cookie, Servant serv);
}
ServantActivator:持久化對象,incarnate 激活/加載,etherealize 去激活/持久化ServantLocator:瞬態對象,preinvoke/postinvoke 每次請求前後調用,支持請求級上下文傳遞| 攔截點 | 服務端 | 客戶端 |
|---|---|---|
| 消息接收 | receive_request_service_context() | send_request_service_context() |
| 請求發送 | send_reply() / send_exception() / send_other() | receive_reply() / receive_exception() / receive_other() |
| IOR 攔截 | establish_components() / components_established() | 同左 |
攔截器實現橫切關注點:事務傳播、安全驗證、鏈路追蹤、負載均衡、熔斷降級。
不要從 ORB 內部實現細節推導生命週期,而應從應用業務需求出發:
對象何時創建?何時準備好服務?何時釋放資源?如何支撐集群故障轉移?
POA 策略組合 + Servant Manager + 攔截器 = 完整的生命週期控制工具箱。
掌握這套模型,才能在 CORBA 系統中設計出健壯、可擴展、可運維的分布式對象架構。