日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

OSGi架構研究

系統 1762 0

OSGi 架構研究

OSGi 概述

?????? OSGi Open Service Gateway Initiative 的簡稱,該組織建立于 1999 年,是一個非贏利機構,旨在建立一個開放的服務規范,為通過網絡向設備提供服務建立開放的標準。 OSGi 并不是專為家庭網絡而制定的,除了住宅網關,像車載電腦等其他移動嵌入式設備也都可以通過 OSGi 接入 Internet ,獲取不同的應用服務。它為服務供應商、軟件供應商、網關開發人員以及設備供應商提供了一個開放、通用的架構,使它們能互動地開發、部署和管理服務。其軟件環境基于 Sun JAVA 虛擬機,并不涉及具體的連接協議。對于任何新設備,它都能夠靈活地將其納入現有網絡。可以使用 OSGi 的對象包括各種數字和模擬的機頂盒、服務網關、有線電視電纜調制解調器、消費類電子產品、 PC 、工業計算機、汽車等。

?

OSGi 體系結構

以下是一張 OSGi 的體系結構圖:

從上圖的層次結構可以看出, Native Operating System 層代表的是本地硬件與操作系統, Java VM 層為跨平臺應用提供了可能。 而再往上,就是 OSGi framework 了。

Bundle 實際就是一個具有 jar(Java ARchive) 格式的文件,其中包含了 java class 文件和其他資源文件(比如圖標,配置文件等等)。 Bundle 可以在自己的 manifest 文件中說明自己能夠提供哪些 java 包,其他 bundle 如果在自己的 manifest 文件中指定了它需要這個包,那他們之間就可能產生 java 包的依賴關系,這樣多個 bundle 之間就可以共享 java 包。

OSGi R4 中將功能分為幾層,包括:安全層、模塊層、生命周期層、服務層和實際的服務。 OSGi 的核心實現即為 OSGi 框架,它本身也是一個 OSGi Bundle

名稱 ( )

職責或功能

Security (安全層)

OSGi 環境中應用的部署和管理提供更好的安全控制。

Modules (模塊層)

主要負責 bundle 的安裝部署,更新和卸載。

Life Cycle( 生命周期層)

Bundle 組件的安全和生命周期操作提供了 API 定義,該層位于安全層和模塊層之上。

Services( 服務層 )

定義了一個與生命周期層緊密結合的組件動態交互模型。 OSGi 中的服務是實現了一個或多個 Java 接口的 Java 對象,通過將這些對象依據其實現的接口注冊到服務注冊表中, Bundle 組件可以發布自己的服務,查找使用服務,注冊監聽處理服務的狀態變更等。

Actual Services( 實際的服務 )

OSGi 定義的一些標準的服務接口如日志服務( Log Service ),包管理服務( Package Admin Service )、啟動級別服務( Start Level Service )、 HTTP 服務( Http Service )、配置服務( Config Admin Service )、用戶管理服務 (User Admin Service) 等。

?

OSGi 容器

現在比較流行的開放源碼的 OSGi 容器有以下三種 :

?

a) ? Equinox 容器是參照 OSGi 規范第 4 版實現的,它構成了 Eclipse IDE 的核心—模塊化的 Java 運行時;它實現了 OSGi 規范 4 中規定的必須強制實現的功能,同時,它也實現了 OSGi 規范中大部分的可選功能;

?

b) Knoflerfish OSGi 規范第 3 版和第 4 版的開源實現,它實現了 OSGi 規范規定的必須實現的功能及部分可選功能;

?

c) Apache Felix Apache 軟件基金會實現的 OSGi 開源容器。

?

?


OSGi 項目實踐

技術是做出來的,不是想出來的。

以下,我將使用 Equonix 作為 OSGi 容器,來做一個小項目,將一天以來學習到的知識用到具體實踐之中。

便攜設備越來越多,連家庭主婦身邊都可能有個 PDA 或者智能手機,優秀的家庭主婦都是管帳的高手,相信做一個支出管理系統會大賣特賣。現在忽略 PDA 或是智能機用的是什么硬件配置以及接口,用 Swing 來模擬前端界面。

?

我把這個系統命名為 ExpenseManager, 下面是系統的包結構:

?

?

pratice.domain ???? ? 用來放實體類

pratice.service ????? 存放支出管理系統提供服務的接口及其實現類

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 類代表一個存儲消費記錄的數據庫表,提供插入,檢索數據,查詢列名等操作,類圖如下:





?

?
?
?

ExpenseManagerService 是系統的服務接口,定義系統可以向外提供的功能,在 1.0 版中只實現了增加支出記錄功能,以后可逐步增加諸如,刪除,修改,統記等功能。下面給出接口及其實現類代碼:

?

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 ,繼續自 JFrame ,同時實現 BundleActivator 接口。只要在 MANIFEST.MF 中指定

Bundle-Activator: pratice.uri.ExpenseManagerURI

framework 就能通過 ClassLoader 找到 pratice.uri.ExpenseManagerURI .class 并加載后,就可以通過 newInstance() 方法創建一個 BundleActivator 的實例,然后調用 public void start(BundleContext context) 方法和 void stop(BundleContext context) 方法來管理 bundle 的生命周期。代碼略。

?????? AddExpenseDialog 是增加支出記錄的對話框。

?

MANIFEST.MF 文件內容如下:

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 容器后,執行效果見下圖:




?
?

?

點擊添加記錄,跳出加支出記錄的對話框。



?

輸入數據提交后,在管理系統界面點擊支出列表,羅列出支出記錄。

?

為顯示 OSGi 架構支持即插即用,動態部署的特性,在 1.1 版中增加統計消費額的功能,只要 執行 Equonix 框架 提供的更新命令, framework 就完成對 bundle 的升級工作。為此,對源代碼進行相應修改。

ExpenseManagerService 接口增加統計方法,實現類與 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 文件內容如下:

Manifest-Version : 1.0

Bundle-ManifestVersion : 2

Bundle-Name font-size: 10pt; color: black; font-family:

OSGi架構研究


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 福建省| 绥江县| 阳谷县| 中宁县| 绥阳县| 北海市| 五台县| 古交市| 阜宁县| 绍兴市| 宽城| 舒兰市| 兴国县| 青浦区| 辉县市| 安岳县| 蓬莱市| 桑日县| 八宿县| 彰化县| 天津市| 五常市| 忻州市| 隆化县| 家居| 湄潭县| 龙游县| 花莲县| 广水市| 呼玛县| 昌吉市| 昌乐县| 沙田区| 兴仁县| 台北县| 叶城县| 收藏| 左云县| 泰顺县| 茂名市| 龙州县|