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

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