OSGi 4.2規(guī)范已發(fā)布 新特性介紹
OSGi 4.2規(guī)范終于在9月中旬發(fā)布,下面介紹一些OSGi 4.2新規(guī)范中的特性。本文原文來自InfoQ的Alex Blewitt發(fā)布的消息。
51CTO編輯推薦:OSGi入門與實(shí)踐全攻略
一些 OSGi 實(shí)現(xiàn),例如 Equinox 3.5 與 Felix 2.0 早已針對 OSGi 4.2 規(guī)范做了一些兼容實(shí)現(xiàn),但當(dāng)時(shí) OSGi 4.2 還沒有發(fā)布,當(dāng)然也不能說其實(shí)現(xiàn)了 OSGi 4.2 規(guī)范。現(xiàn)在規(guī)范正式發(fā)布了,各實(shí)現(xiàn)團(tuán)隊(duì)還需要進(jìn)行一些調(diào)整已完全滿足規(guī)范要求。
新的規(guī)范里有哪些特性呢?
框架啟動(dòng)( Framework launching)
以前雖然可以在 Java 應(yīng)用中(例如 Equinox 的 servlet 橋接 )啟動(dòng)嵌入的 OSGi 引擎,但針對特定引擎都有特定的啟動(dòng)方式。雖然有一些包裝器(例如 Pax Runner )使得引擎啟動(dòng)相對容易,但還是必須熟悉特定引擎的知識(shí)。在現(xiàn)在的規(guī)范中,定義了透明的啟動(dòng)機(jī)制使得不需要知道 OSGi 實(shí)現(xiàn)引擎就可以將其啟動(dòng)。這樣一來,不管是在 Equinox 還是 Felix 下測試都只用替換啟動(dòng)類路徑下的相應(yīng)引擎 Jar 包就可以了。
遠(yuǎn)程服務(wù)(Remote Service)
以前也許你曾經(jīng)聽說過分布式 OSGi(Distributed OSGi)以及 RFC 113,而 OSGi 4.2 中的遠(yuǎn)程服務(wù)就是類似技術(shù)的新名字,它將各個(gè) OSGi 虛擬機(jī)(OSGi VMs)連接到了一起。遠(yuǎn)程服務(wù)采用了服務(wù) 的概念(熱拔插 OSGi 應(yīng)用的精髓),提供了導(dǎo)出服務(wù)到遠(yuǎn)程消費(fèi)端與在本地消費(fèi)遠(yuǎn)程服務(wù)的機(jī)制。與其他分布式方法(例如 RMI)不同的是,遠(yuǎn)程服務(wù)不需要實(shí)現(xiàn)特殊接口,也不用拋出 checked exception 。當(dāng)然,發(fā)生異常的時(shí)候遠(yuǎn)程服務(wù)不會(huì)裝作工作正常,可以把異常看作是一種在任何情況下都因該進(jìn)入并作用于 OSGi 環(huán)境的服務(wù)。
籌備服務(wù)(Blueprint Service)
OSGi 4.2 中的籌備服務(wù)的概念非常類似于控制反轉(zhuǎn) / 依賴注射。它允許客戶端從外部配置文件指定連接的服務(wù),此服務(wù)將被動(dòng)態(tài)地連接到客戶端。向聲明式服務(wù)一樣,你可以對服務(wù)類型上做些限制,例如是否為強(qiáng)制(mandatory);但與聲明式服務(wù)也有些不同,當(dāng)所需服務(wù)缺失時(shí)籌備服務(wù)可以提供一個(gè)默認(rèn)的服務(wù)代理實(shí)現(xiàn),當(dāng)客戶代碼嘗試調(diào)用此服務(wù)時(shí),客戶端將被服務(wù)代理阻塞,直到真正的服務(wù)連接成功。綜上,使用籌備服務(wù)的特性可以避免與 OSGi 產(chǎn)生耦合,這使得應(yīng)用既可以在 OSGi 環(huán)境內(nèi)運(yùn)行,也可以脫離 OSGi 環(huán)境運(yùn)行。
Bundle 追蹤器(Bundle Tracker)
OSGi 早已有了服務(wù)追蹤器,用于監(jiān)控服務(wù)的來龍去脈;而 Bundle 追蹤器是追蹤 bundles 的一個(gè)擴(kuò)展。在以前在服務(wù)中就可以使用 BundleListener 來監(jiān)聽 bundle 動(dòng)態(tài)進(jìn)出,而如今的 BundleTracker 與 ServiceListener 有著同等的可用性。其可被用于執(zhí)行動(dòng)態(tài)注冊當(dāng)籌備服務(wù)或是聲明式服務(wù)正在讀?。ㄅc處理)元數(shù)據(jù)。例如,一個(gè)基于 Web 的引擎就可以自動(dòng)地掃描出新安裝的 bundles,并通過 HttpService 自動(dòng)注冊 servlets。
服務(wù)鉤子(Service Hooks)
在判斷存在什么服務(wù)時(shí),是可以對服務(wù)之間的事件進(jìn)行攔截、過濾的。例如在實(shí)現(xiàn)一個(gè)基于角色的權(quán)限模型或是針對不同產(chǎn)品級禁用 / 可用對應(yīng)功能集。另一個(gè)方法是提供代理服務(wù)(或是負(fù)載均衡)從而攔截其他 bundle 的事件將其隱藏,以備在后續(xù)階段代理給其他機(jī)制(例如分布式服務(wù))。另外,監(jiān)聽鉤子也可以在服務(wù)沒有被注冊前按需將服務(wù)啟動(dòng)。
條件化的權(quán)限(Conditional permissions)
OSGi 4.2 在有關(guān)權(quán)限方面的升級包含了拒絕訪問(DENY access)與允許訪問。在認(rèn)證簽名后,可以為 bundles 子集顯示地指定操作權(quán)限??梢枣i定未簽名的 bundles 的安裝,有助于構(gòu)建一個(gè)安全的 OSGi 平臺(tái)。
OSGi 4.2 規(guī)范相對于 4.1 版還有很多變化,例如 OSGi bundles 有自己的 MIME 類型 (application/vnd.osgi.bundle ),可以為某個(gè) bundle 指定圖標(biāo)以及許可證,對于聲明式服務(wù)可以簡化其權(quán)限集合設(shè)置(使用包內(nèi)友好替代了 protected)。DS schema 也允許其他對特定服務(wù)信息有助的 XML 元素。另外,提供了一個(gè)機(jī)制使得應(yīng)用管理員可以在應(yīng)用結(jié)束是獲取該應(yīng)用的返回值。
Equinox 3.5 已經(jīng)提供了一些類似的功能,Apache Felix 對類似功能在這個(gè)月初也通過了測試(早于 4.2 規(guī)范發(fā)布)。這個(gè)月結(jié)束前,OSGi 官方將針對 4.2 規(guī)范發(fā)布測試套件相關(guān)信息。
【編輯推薦】