天天看點

你們也在用osgi嗎?子產品化的規範 誰在用osgi osgi中的Bundle osgi中的service osgi開發環境的搭建執行個體osgi

在Java中現在是沒有一個子產品化的概念的,或者說沒有一個事實上的标準。就是如何組成一個子產品,然後哪些子產品是給内部使用,哪些子產品是給外部使用的。

OSGI就可以解決上面的問題,應用程式可以像搭積木一樣完成搭建,例如對于一個正在運作的系統,壓根日志服務,但目前系統中沒有提供日志服務的子產品,那麼可以直接開發出相應的日志服務子產品,然後動态的加載到系統中,不需要重新啟動服務,隻需要動态的注冊就可以,這樣日志服務就可以使用了。

這是一個使用osgi的開源系統

詳細介紹的位址:

<a>http://www.iteye.com/news/23015</a>

其實搞過開發的大概都知道,業界中鼎鼎大名的eclipse就是基于osgi來開發的。

并且很多大的應用廠商也在使用osgi進行子產品化的開發。

包括spring、ibm的websphere和oracle的weblogic都已經宣布了支援osgi,這也同樣可以看出,成為業界的标準可能就是下一步的問題。

bundle其中有包的意思,這個是osgi中比較核心的一個概念,也就是說我們控制osgi就是通過bundle來進行控制的。

bundle可以被動态的安裝、啟動、停止和解除安裝。并且Bundle也是服務群組件的載體。

看看Bundle Jar File的結構圖:

Bundle的生命周期狀态圖:

Bundle狀态解析:

•INSTALLED — 成功安裝bundle。

•RESOLVED — 所有bundle需要的Java類可用。這個狀态标志着 bundle已經是啟動就緒或者是已經停止。

•STARTING — 正在啟動bundle。調用了bundle激活器的start方法,而且還沒有從方法中傳回。

•ACTIVE — bundle已經啟動完畢,正在運作中。

•STOPPING — 正在停止bundle。調用了bundle激活器的stop方法,而且還沒有從方法中傳回。

•UNINSTALLED — bundle已經解除安裝完畢,不能進入其他狀态。

Class Loading的概念圖:

再看看服務注冊

看看上邊這個圖是不是非常熟悉,典型的一個服務注冊,釋出,尋址的結構圖,跟SOA的架構基本一緻,也就是說osgi也是實作soa技術的方式之一。

通過上面的介紹,可以看出,其實Bundle就是我們手中的積木,通過osgi的架構把這些積木組織在一起,就形成了系統。

Bundle間的互動方式有兩種:

1)通過package的Export和Import來進行。

2)另一種方式是通過Service的方式進行。

定義了動态協作模型,該模型是一個釋出、查找和綁定的模型。

Bundle可以注冊服務、搜尋服務、監聽服務。通過BundleContext完成注冊和擷取服務,通過ServiceListener監聽服務的狀态。

OSGi 4推出了Declarative Services(DS) DS 提出了完整的 Service-Oriented Component Model (SOCM),面向服務的元件化模型—更好支援服務注冊、擷取、監聽。

Component存在于Bundle中,可以互相調用。

SOCM的示意圖如下:

選擇eclipse3.1之後的版本的eclipse.

選擇Run-&gt;Run Configuration

打開如下界面

在OSGI Framework上點選右鍵,建立,将顯示所有的Bundles

取消所有Bundles的選擇,隻選擇org.eclipse.osgi這個Bundle

運作,如果控制台中出現osgi&gt;并且沒有提示錯誤資訊,說明配置成功。

然後輸入ss,則可出現如下界面:

至此環境搭建完畢。

建立一個Plug-in project

然後點選下一步,輸入工程名,要注意This plug-in is targeted to run with:這裡選擇的是standard

添入插件相關資訊:

打開生成的Activator類,在start和stop方法中加入輸出

 然後右鍵工程,選擇Run Configuration,将Default Auto-Start設定為false

運作應用,分别輸入start 1、ss、stop 1、ss

得到如下結果,則證明運作成功