天天看點

OSGI的一點了解

OSGi 規範簡介

OSGi 聯盟建立于 1999 年,是一個非赢利機構,旨在建立一個開放的服務規範。OSGi 規範為網絡服務定義了一個标準的、面向元件的計算環境,它最初的目的就是為各種嵌入式裝置提供通用的軟體運作平台,屏蔽裝置作業系統與硬體差別的中間件平台,通過這個平台,可以對不同軟體商提供的應用(OSGi 中稱為 Bundle)進行元件的生命周期管理的能力,如應用元件可以從運作中被安裝、更新或者移除而不需要中斷裝置的操作,應用元件可以動态的發現和使用其他庫或者應用程式。由于 OSGi 技術具有服務元件子產品化、動态加載應用等優點,正被越來越多的領域關注,如嵌入裝置制造業、汽車制造業、企業應用等。目前,OSGi 聯盟釋出的最新的 OSGi 服務規範為 4.0,讀者可以查閱參考資料了解詳細資訊。

OSGi 體系結構

OSGi 的體系架構是基于插件式的軟體結構,包括一個 OSGi 架構和一系列插件,在 OSGi中,插件稱為 Bundle,其中,OSGi 架構規範是 OSGi 規範的核心部分,它提供了一個通用的、安全可管理的 Java 架構,通過這個架構,可以支援 Bundle 服務應用的部署和擴充。Bundle 之間可以通過 Import Package 和 Require-Bundle 來共享 Java 類,在 OSGi 服務平台中,使用者通過開發 Bundle 來提供需要的功能,這些 Bundle 可以動态加載和解除安裝,或者根據需要遠端下載下傳和更新

Execution Environment:Bundle 應用所倚賴運作的 Java 執行環境,如 J2SE-1.4、CDC-1.0 等都是可用的執行環境。

Modules:子產品層定義了 Bundle 應用的加載政策。OSGi 架構是一個健壯并且嚴格定義的類加載模型。在大多數 Java 應用中,通常隻有一個單獨的 ClassPath,它包含了所有的 Java 類檔案和資源檔案,OSGi基于Java技術,對于每個實作了 BundleActivator 接口的 Bundle 應用,為它生成一個單獨的 ClassLoader,使得 Bundle 應用的組織更加子產品化。

Life Cycle:生命周期層可以動态地對 Bundle 進行安裝、啟動、停止、更新和解除安裝等操作。該層基于子產品層,提供了一組 API 來控制 Bundle 應用的運作時操作。

Service Registry 和 Services:OSGi 服務層定義了一個內建在生命周期層中的動态協作模型,是一個釋出、動态尋找、綁定的服務模型。一個服務通常是一個 Java 對象實作了特定的服務接口,并且通過服務注冊,被綁定到 OSGi 的運作環境中。Bundle 應用可以注冊釋出服務,動态綁定服務,并且在服務注冊狀态改變時,可以接受到事件消息等。

Security:OSGi 的安全管理是基于 Java2 安全體系的,貫穿在 OSGi 平台的所有層中,它能夠對部署在 OSGi 運作環境中的 Bundle 應用進行詳細的管理控制。

Bundle 生命周期的狀态

在一個動态擴充的 OSGi 環境中,OSGi 架構管理 Bundle 的安裝和更新,同時也管理 Bundle 和服務之間的依賴關系。一個 Bundle 可能處于以下六個狀态

INSTALLED:安裝完成,本地資源成功加載。

RESOLVED:依賴關系滿足,這個狀态意味該Bundle要麼已經準備好運作,要麼是被停止了。STARTING:Bundle正在被啟動,BundleActivator的start()方法已經被調用但是還沒有傳回。

STOPPING:Bundle正在被停止,BundleActivator的stop()方法已經被調用但是還沒有傳回。

ACTIVE:Bundle 被成功啟動并且在運作。

UNINSTALLED:bundle被解除安裝并且無法進入其他狀态。

Bundle接口定義了getState()方法來傳回Bundle的狀态。

Bundle的部署及運作

在Eclipse平台中,選擇File-->Export...菜單,将開發的example和exampleClient兩個Bundle應用導出成Jar檔案,以便将它們部署到OSGi服務平台中。選擇将要運作的Bundle應用,滑鼠右鍵點選,在彈出菜單中,選擇Run AS-->Equinox FrameWork來啟動OSGi服務平台。在Equinox啟動配置控制台中,可以為Bundle應用設定預設的Start Level和Bundle應用是否需要自動啟動等選項。在本例中,為了講解如何安裝及啟動Bundle應用,隻将example Bundle應用設為自動啟動,而exampleClient Bundle應用需要我們用指令安裝及啟動。

當OSGi Equinox FrameWork啟動後,在OSGi控制指令台中輸入ss指令,可以檢視OSGi服務平台中已經安裝的Bundle應用資訊及其狀态。如圖4所示,可以看到目前OSGi服務平台中有兩個Bundle處于Active狀态,其中,system.bundle_3.2.0.v20060328為OSGi架構的系統Bundle,而example_1.0.0為注冊姓名查詢服務的Bundle應用,1.0.0為Bundle應用的版本号。

圖示4 Bundle資訊查詢

OSGI的一點了解

在OSGi控制指令台中利用install指令安裝exampleClient Bundle應用,用ss指令檢視安裝後的Bundle應用資訊及其狀态。如圖5所示:

圖示5 安裝Bundle

OSGI的一點了解

在OSGi控制指令台中利用start指令安裝exampleClient Bundle應用,使用者可輸入姓名,利用姓名查詢服務來判斷所輸入姓名是否有效,用ss指令檢視啟動後的Bundle應用資訊及其狀态。如圖6所示:

圖示6 啟動Bundle

OSGI的一點了解

使用者在在OSGi控制指令台中,可利用stop指令來停止指定的Bundle應用,close指令用來停止并退出OSGi控制指令台。關于OSGi Equinox FrameWork控制台指令的詳細資訊,可檢視參考資料。

對于OSGi的成功應用,最有名的應該是eclipse了,它就是基于OSGi service platform的産品。還有Apache,據說OSGi将被應用于其新一代的build工具中。這些都是j2se和j2ee的應用,而基于j2me的,手機(對應OSGi Alliance的MEG)和車載裝置(對應OSGi Alliance的VEG)是OSGi的主要領域,OSGi Alliance已經有相應的規範,這些領域的應用相信會更加精彩,讓我們拭目以待吧。