在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->Run Configuration
打開如下界面
在OSGI Framework上點選右鍵,建立,将顯示所有的Bundles
取消所有Bundles的選擇,隻選擇org.eclipse.osgi這個Bundle
運作,如果控制台中出現osgi>并且沒有提示錯誤資訊,說明配置成功。
然後輸入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
得到如下結果,則證明運作成功