OSGi 4.2 規範於 9 月中旬正式發布。Equinox 3.5、Felix 2.0 等實作早已針對 4.2 進行相容性開發,如今規範定案,各實作團隊將全面對齊。本文整理自 InfoQ Alex Blewitt 報導,介紹六大核心新特性。
以往在 Java 應用中啟動嵌入式 OSGi 引擎(如 Equinox Servlet Bridge)需依賴特定引擎啟動方式。雖有 Pax Runner 等封裝工具簡化流程,仍需熟悉特定引擎知識。4.2 定義透明啟動機制,無需知曉具體實作即可啟動,測試時僅需替換 Classpath 下的引擎 JAR 即可在 Equinox/Felix 間切換。
前身為分散式 OSGi (Distributed OSGi) / RFC 113。將多個 OSGi VM 連接,採用服務概念(熱插拔核心),提供導出服務至遠程消費端與本地消費遠程服務機制。不同於 RMI 等傳統分散式技術:無需實作特殊介面、無需拋出 checked exception。異常視為服務一部分,自然融入 OSGi 環境。
概念近似 IoC/DI,允許客戶端從外部配置檔指定連接服務,動態連接至客戶端。類似宣告式服務可限制服務類型(如強制性),但不同處在於:服務缺失時可提供預設代理實作,客戶端調用時被阻塞直到真實服務連接成功。此特性避免與 OSGi 產生耦合,應用可在 OSGi 環境內外皆可運行。
OSGi 已有服務追蹤器監控服務生命週期;Bundle Tracker 為追蹤 Bundle 的擴展。以往用 BundleListener 監聽 Bundle 動態進出,如今 BundleTracker 與 ServiceListener 具同等可用性。可用於動態註冊:當藍圖服務或宣告式服務讀取處理中繼資料時。例:Web 引擎自動掃描新安裝 Bundle,透過 HttpService 自動註冊 Servlet。
判斷服務存在時可攔截、過濾服務事件。應用場景:基於角色的權限模型、不同產品等級啟用/停用功能集、提供代理服務或負載平衡攔截其他 Bundle 事件隱藏以備後續代理(如分散式服務)。監聽鉤子亦可在服務未註冊前按需啟動服務。
權限模型升級包含拒絕存取與允許存取。認證簽名後可為 Bundle 子集顯式指定操作權限,可鎖定未簽名 Bundle 安裝,助構建安全 OSGi 平台。
application/vnd.osgi.bundleEquinox 3.5 已提供類似功能,Felix 本月初通過測試。月底前 OSGi 官方將發布 4.2 相容性測試套件資訊。