OSGi 架構(gòu)研究
OSGi 概述
?????? OSGi 是 Open Service Gateway Initiative 的簡(jiǎn)稱,該組織建立于 1999 年,是一個(gè)非贏利機(jī)構(gòu),旨在建立一個(gè)開放的服務(wù)規(guī)范,為通過(guò)網(wǎng)絡(luò)向設(shè)備提供服務(wù)建立開放的標(biāo)準(zhǔn)。 OSGi 并不是專為家庭網(wǎng)絡(luò)而制定的,除了住宅網(wǎng)關(guān),像車載電腦等其他移動(dòng)嵌入式設(shè)備也都可以通過(guò) OSGi 接入 Internet ,獲取不同的應(yīng)用服務(wù)。它為服務(wù)供應(yīng)商、軟件供應(yīng)商、網(wǎng)關(guān)開發(fā)人員以及設(shè)備供應(yīng)商提供了一個(gè)開放、通用的架構(gòu),使它們能互動(dòng)地開發(fā)、部署和管理服務(wù)。其軟件環(huán)境基于 Sun 的 JAVA 虛擬機(jī),并不涉及具體的連接協(xié)議。對(duì)于任何新設(shè)備,它都能夠靈活地將其納入現(xiàn)有網(wǎng)絡(luò)。可以使用 OSGi 的對(duì)象包括各種數(shù)字和模擬的機(jī)頂盒、服務(wù)網(wǎng)關(guān)、有線電視電纜調(diào)制解調(diào)器、消費(fèi)類電子產(chǎn)品、 PC 、工業(yè)計(jì)算機(jī)、汽車等。
?
OSGi 體系結(jié)構(gòu)
以下是一張 OSGi 的體系結(jié)構(gòu)圖:
從上圖的層次結(jié)構(gòu)可以看出, Native Operating System 層代表的是本地硬件與操作系統(tǒng), Java VM 層為跨平臺(tái)應(yīng)用提供了可能。 而再往上,就是 OSGi framework 了。
Bundle 實(shí)際就是一個(gè)具有 jar(Java ARchive) 格式的文件,其中包含了 java 的 class 文件和其他資源文件(比如圖標(biāo),配置文件等等)。 Bundle 可以在自己的 manifest 文件中說(shuō)明自己能夠提供哪些 java 包,其他 bundle 如果在自己的 manifest 文件中指定了它需要這個(gè)包,那他們之間就可能產(chǎn)生 java 包的依賴關(guān)系,這樣多個(gè) bundle 之間就可以共享 java 包。
OSGi 在 R4 中將功能分為幾層,包括:安全層、模塊層、生命周期層、服務(wù)層和實(shí)際的服務(wù)。 OSGi 的核心實(shí)現(xiàn)即為 OSGi 框架,它本身也是一個(gè) OSGi Bundle 。
名稱 ( 層 ) |
職責(zé)或功能 |
Security (安全層) |
對(duì) OSGi 環(huán)境中應(yīng)用的部署和管理提供更好的安全控制。 |
Modules (模塊層) |
主要負(fù)責(zé) bundle 的安裝部署,更新和卸載。 |
Life Cycle( 生命周期層) |
為 Bundle 組件的安全和生命周期操作提供了 API 定義,該層位于安全層和模塊層之上。 |
Services( 服務(wù)層 ) |
定義了一個(gè)與生命周期層緊密結(jié)合的組件動(dòng)態(tài)交互模型。 OSGi 中的服務(wù)是實(shí)現(xiàn)了一個(gè)或多個(gè) Java 接口的 Java 對(duì)象,通過(guò)將這些對(duì)象依據(jù)其實(shí)現(xiàn)的接口注冊(cè)到服務(wù)注冊(cè)表中, Bundle 組件可以發(fā)布自己的服務(wù),查找使用服務(wù),注冊(cè)監(jiān)聽處理服務(wù)的狀態(tài)變更等。 |
Actual Services( 實(shí)際的服務(wù) ) |
OSGi 定義的一些標(biāo)準(zhǔn)的服務(wù)接口如日志服務(wù)( Log Service ),包管理服務(wù)( Package Admin Service )、啟動(dòng)級(jí)別服務(wù)( Start Level Service )、 HTTP 服務(wù)( Http Service )、配置服務(wù)( Config Admin Service )、用戶管理服務(wù) (User Admin Service) 等。 |
?
OSGi 容器
現(xiàn)在比較流行的開放源碼的 OSGi 容器有以下三種 :
?
a) ? Equinox 容器是參照 OSGi 規(guī)范第 4 版實(shí)現(xiàn)的,它構(gòu)成了 Eclipse IDE 的核心—模塊化的 Java 運(yùn)行時(shí);它實(shí)現(xiàn)了 OSGi 規(guī)范 4 中規(guī)定的必須強(qiáng)制實(shí)現(xiàn)的功能,同時(shí),它也實(shí)現(xiàn)了 OSGi 規(guī)范中大部分的可選功能;
?
b) Knoflerfish 是 OSGi 規(guī)范第 3 版和第 4 版的開源實(shí)現(xiàn),它實(shí)現(xiàn)了 OSGi 規(guī)范規(guī)定的必須實(shí)現(xiàn)的功能及部分可選功能;
?
c) Apache 的 Felix 是 Apache 軟件基金會(huì)實(shí)現(xiàn)的 OSGi 開源容器。
?
?
OSGi 項(xiàng)目實(shí)踐
技術(shù)是做出來(lái)的,不是想出來(lái)的。
以下,我將使用 Equonix 作為 OSGi 容器,來(lái)做一個(gè)小項(xiàng)目,將一天以來(lái)學(xué)習(xí)到的知識(shí)用到具體實(shí)踐之中。
便攜設(shè)備越來(lái)越多,連家庭主婦身邊都可能有個(gè) PDA 或者智能手機(jī),優(yōu)秀的家庭主婦都是管帳的高手,相信做一個(gè)支出管理系統(tǒng)會(huì)大賣特賣。現(xiàn)在忽略 PDA 或是智能機(jī)用的是什么硬件配置以及接口,用 Swing 來(lái)模擬前端界面。
?
我把這個(gè)系統(tǒng)命名為
ExpenseManager,
下面是系統(tǒng)的包結(jié)構(gòu):
?
?
pratice.domain ???? ? 用來(lái)放實(shí)體類
pratice.service ????? 存放支出管理系統(tǒng)提供服務(wù)的接口及其實(shí)現(xiàn)類
pratice.uri ????????????? 界面相關(guān)的類
?
完成 1.0 版時(shí)的包結(jié)構(gòu)如下:
?
?
其中, Expense 是代表一條消費(fèi)記錄的實(shí)體類,其定義如下:
public class Expense {
???
??? private int id ; ????????? // 消費(fèi) ID
??? private String date ; // 消費(fèi)時(shí)間
??? private String item ; // 消費(fèi)項(xiàng)目
??? private float money ; ?? ? // 消費(fèi)額
???
??? public String getDate() {
?????? return date ;
??? }
??? public void setDate(String date) {
?????? this . date = date;
??? }
……// 省略其它屬性 get,set 方法
}
ExpenseDB 類代表一個(gè)存儲(chǔ)消費(fèi)記錄的數(shù)據(jù)庫(kù)表,提供插入,檢索數(shù)據(jù),查詢列名等操作,類圖如下:
?
?
?
?
ExpenseManagerService 是系統(tǒng)的服務(wù)接口,定義系統(tǒng)可以向外提供的功能,在 1.0 版中只實(shí)現(xiàn)了增加支出記錄功能,以后可逐步增加諸如,刪除,修改,統(tǒng)記等功能。下面給出接口及其實(shí)現(xiàn)類代碼:
?
public interface ExpenseManagerService {
??? public void addExpense(Expense expense);
}
?
public class ExpenseManagerServiceImpl implements ExpenseManagerService {
??? private ExpenseDB expenseDB ;
??? public ExpenseManagerServiceImpl(ExpenseDB expenseDB ) {
?????? this . expenseDB = expenseDB ;
??? }
??? public void addExpense(Expense expense) {
?????? expenseDB .addExpense(expense);
??? }
}
?
ExpenseManagerURI 類是界面類,也是 bundle 中的 Activator ,繼續(xù)自 JFrame ,同時(shí)實(shí)現(xiàn) BundleActivator 接口。只要在 MANIFEST.MF 中指定
Bundle-Activator: pratice.uri.ExpenseManagerURI
framework 就能通過(guò) ClassLoader 找到 pratice.uri.ExpenseManagerURI .class 并加載后,就可以通過(guò) newInstance() 方法創(chuàng)建一個(gè) BundleActivator 的實(shí)例,然后調(diào)用 public void start(BundleContext context) 方法和 void stop(BundleContext context) 方法來(lái)管理 bundle 的生命周期。代碼略。
?????? AddExpenseDialog 是增加支出記錄的對(duì)話框。
?
MANIFEST.MF 文件內(nèi)容如下:
Manifest-Version : 1.0
Bundle-ManifestVersion : 2
Bundle-Name : ExpenseManager Plug-in
Bundle-SymbolicName : ExpenseManager
Bundle-Version : 1.0.0
Bundle-Activator : pratice.uri.ExpenseManagerURI
Bundle-Localization : plugin
Import-Package : org.osgi.framework; version ="1.3.0 "
?
布署到 Equonix 容器后,執(zhí)行效果見下圖:
?
?
?
點(diǎn)擊添加記錄,跳出加支出記錄的對(duì)話框。
?
輸入數(shù)據(jù)提交后,在管理系統(tǒng)界面點(diǎn)擊支出列表,羅列出支出記錄。
?
為顯示 OSGi 架構(gòu)支持即插即用,動(dòng)態(tài)部署的特性,在 1.1 版中增加統(tǒng)計(jì)消費(fèi)額的功能,只要 執(zhí)行 Equonix 框架 提供的更新命令, framework 就完成對(duì) bundle 的升級(jí)工作。為此,對(duì)源代碼進(jìn)行相應(yīng)修改。
ExpenseManagerService 接口增加統(tǒng)計(jì)方法,實(shí)現(xiàn)類與 ExpenseDB 類作相應(yīng)修改。
?
public interface ExpenseManagerService { ?
??? public void addExpense(Expense expense);
??? public float sumAllCost ();
}
public class ExpenseManagerServiceImpl implements ExpenseManagerService {
??? private ExpenseDB expenseDB ;
??? public ExpenseManagerServiceImpl(ExpenseDB expenseDB) {
?????? this . expenseDB = expenseDB;
??? }
??? public void addExpense(Expense expense) {
?????? expenseDB .addExpense(expense);
??? }
??? public float sumAllCost() {
?????? return expenseDB .sumAllCost();
??? }
}
public class ExpenseDB {
???
??? private List<Expense> expenseList ;
……// 其余代碼省略
??? public float sumAllCost() {
?????? float sum = 0;
?????? for ( int i = 0; i <= expenseList .size(); i++ ){
?????????? sum += ((Expense) expenseList .get(i)).getMoney();
?????? }
?????? return sum;
??? }
}
MANIFEST.MF 文件內(nèi)容如下:
Manifest-Version : 1.0
Bundle-ManifestVersion : 2
Bundle-Name font-size: 10pt; color: black; font-family:
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
