成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

初探Java企業(yè)級(jí)開(kāi)源框架OSGi

開(kāi)發(fā) 后端
OSGi框架在國(guó)外關(guān)注率是很高,但在國(guó)內(nèi)的推廣和使用卻不夠廣泛,可能是因?yàn)镺SGi字面上的意思太過(guò)于抽象。本文作者通過(guò)對(duì)OSGi產(chǎn)生背景與特性的描述像大家詳細(xì)介紹了OSGi,并通過(guò)一個(gè)Hello World的實(shí)力帶您詳細(xì)了解OSGi的運(yùn)行機(jī)制。

第一次接觸OSGi 是2006年看見(jiàn)的一則網(wǎng)上新聞,該新聞中提到BMW 汽車(chē)的通信-娛樂(lè)(infotainment)系統(tǒng)采用了OSGi 架構(gòu),這套系統(tǒng)主要用來(lái)控制汽車(chē)上的音箱、燈光、導(dǎo)航和通訊等設(shè)備,整個(gè)系統(tǒng)由1000多個(gè)模塊組成,啟動(dòng)時(shí)間卻只需要3.5秒鐘,這對(duì)于一個(gè)基于Java 的框架來(lái)講,具有兩個(gè)重大意義:一、說(shuō)明了Java 執(zhí)行效率并不差;二、OSGi 框架的性能尤其優(yōu)秀。因此筆者對(duì)OSGi 框架產(chǎn)生了極大的興趣,后來(lái)終于在一個(gè)項(xiàng)目中負(fù)責(zé)研究和開(kāi)發(fā)基于OSGi 框架的應(yīng)用程序,從此對(duì)它便情有獨(dú)鐘。令人欣慰的是,OSGi 在2007年取得了諸多戰(zhàn)果:BEA 公司、Eclipse 基金會(huì)和Interface21 公司相繼加入OSGi 聯(lián)盟;在EclipseCon 2007大會(huì)上引起了業(yè)界的廣泛關(guān)注,其中以Spring-OSGi、Web Service 與OSGi 等技術(shù)最為引人注目,這也標(biāo)志著OSGi 將在未來(lái)與企業(yè)應(yīng)用緊密結(jié)合;OSGi R4 標(biāo)準(zhǔn)發(fā)布,相關(guān)內(nèi)容被成功的寫(xiě)入JSR 291 規(guī)范中;Spring 2.5 框架的發(fā)布,宣稱(chēng)其所有jar 包都兼容OSGi 標(biāo)準(zhǔn);雖然OSGi 沒(méi)能成功進(jìn)入JavaEE 6 草擬計(jì)劃中,但是Sun 公司宣稱(chēng)會(huì)在下一代Java EE 標(biāo)準(zhǔn)中重點(diǎn)考慮OSGi。因此筆者個(gè)人認(rèn)為,在不久的將來(lái)OSGi 勢(shì)必會(huì)在企業(yè)應(yīng)用中發(fā)揮出強(qiáng)大的作用,基于OSGi 框架的產(chǎn)品也將層出不窮。本文從OSGi 的歷史背景、OSGi 的特點(diǎn)、OSGi 開(kāi)源框架介紹、OSGi 開(kāi)發(fā)環(huán)境部署、OSGi 版的Hello World 五個(gè)部分對(duì)OSGi 框架進(jìn)行概要的介紹,希望讀者能從中有所收獲。

51CTO編輯推薦:OSGi入門(mén)與實(shí)踐全攻略

OSGi 的歷史背景

什么是OSGi 呢?OSGi——Open Service Gateway Initiative 字面上的意思是一個(gè)公共的服務(wù)平臺(tái)。1999年OSGi 聯(lián)盟成立,它是一個(gè)非盈利的國(guó)際組織,旨在建立一個(gè)開(kāi)放的服務(wù)規(guī)范,為通過(guò)網(wǎng)絡(luò)向設(shè)備提供服務(wù)建立開(kāi)放的標(biāo)準(zhǔn),是開(kāi)放業(yè)務(wù)網(wǎng)關(guān)的發(fā)起者。OSGi 聯(lián)盟的初始目標(biāo)是構(gòu)建一個(gè)在廣域網(wǎng)和局域網(wǎng)或設(shè)備上展開(kāi)業(yè)務(wù)的基礎(chǔ)平臺(tái)。歷史總是具有驚人的相似性,正如Java 誕生于一個(gè)嵌入式開(kāi)發(fā)的項(xiàng)目中,卻被應(yīng)用于網(wǎng)絡(luò)平臺(tái)的開(kāi)發(fā),對(duì)OSGi 的最早設(shè)計(jì)也是針對(duì)嵌入式應(yīng)用的,諸如機(jī)頂盒、服務(wù)網(wǎng)關(guān)、手機(jī)、汽車(chē)等都是其應(yīng)用的主要環(huán)境。后來(lái),由于OSGi 的諸多優(yōu)秀特性(可動(dòng)態(tài)改變系統(tǒng)行為,熱插拔的插件體系結(jié)構(gòu),高可復(fù)用性,高效性等等),它被應(yīng)用于許多PC 上的應(yīng)用開(kāi)發(fā),因此逐步為開(kāi)發(fā)者所知和鐘愛(ài)。現(xiàn)在人們對(duì)OSGi 的理解已經(jīng)遠(yuǎn)遠(yuǎn)不是它字面和初衷所能解釋的了,筆者認(rèn)為稱(chēng)其為一個(gè)輕巧的、松耦合的、面向服務(wù)的應(yīng)用程序開(kāi)發(fā)框架更為確切一些。

OSGi 真正被大家所知還是和Eclipse 有密切關(guān)系的。Eclipse 很多年都是Java 開(kāi)發(fā)者的首選IDE,相信只要是一個(gè)Java 開(kāi)發(fā)者,應(yīng)該沒(méi)有人不知道Eclipse 的。在Eclipse 3.0 以前的版本中,它本身有一套自身的插件體系,而該插件體系的設(shè)計(jì)非常精巧細(xì)致,受到許多開(kāi)發(fā)者的推崇,但是Eclipse 基金在Eclipse 3.0 發(fā)布的時(shí)候,做出了一個(gè)大膽的行為,就是將Eclipse 逐步遷移到OSGi 框架中,并自己實(shí)現(xiàn)了一個(gè)OSGi 開(kāi)源框架,取名為Equinox,該框架隨著每次Eclipse 的發(fā)布也會(huì)相應(yīng)的更新。Eclipse 之所以這么做,其一是因?yàn)镋clipse 的插件體系與OSGi 的設(shè)計(jì)思想不謀而合,其二也是因?yàn)镺SGi 更為規(guī)范,其對(duì)插件體系的定義也更為完整一些。事實(shí)證明Eclipse 在采用OSGi 架構(gòu)后,無(wú)論從性能、可擴(kuò)展性這兩個(gè)方面來(lái)講還是從二次開(kāi)發(fā)的角度來(lái)定義,都取得巨大的成功。下圖展示了Eclipse 與OSGi 框架的關(guān)系。

OSGi 的特點(diǎn)

在介紹OSGi 框架的特點(diǎn)之前,先簡(jiǎn)單的介紹一下OSGi 框架的各個(gè)部分,如下圖所示。

解釋一下上圖中每一層的含義,其中OS 層和JVM 層可以不用詳細(xì)介紹了,重點(diǎn)需要關(guān)注的是應(yīng)用程序Bundles 層。框架本身提供的類(lèi)加載,生命周期管理,服務(wù)注冊(cè)和規(guī)范服務(wù)也都是針對(duì)Bundles 的。每一個(gè)在OSGi 框架中運(yùn)行的邏輯單元稱(chēng)為一個(gè)Bundle,Bundle 實(shí)際是一個(gè)符合特定形式的jar 文件。每一個(gè)Bundle 的功能可以是抽象的也可以是具體的。所謂抽象,就是它不是一個(gè)具體的應(yīng)用,沒(méi)有完成一些業(yè)務(wù)功能,而只暴露了一些接口或者功能給其他的Bundle 使用;所謂具體,就是該Bundle 可以獨(dú)立的完成一個(gè)功能,例如連接數(shù)據(jù)庫(kù),獲取數(shù)據(jù)等等。Bundle 有六種狀態(tài),分別是:installed(安裝完成,本地資源成功加載),resolved(依賴(lài)關(guān)系滿(mǎn)足,即該Bundle 要么是準(zhǔn)備好運(yùn)行了,要么是已經(jīng)被停止了),starting(Bundle 正在被啟動(dòng)),stopping(Bundle 正在被停止),active(Bundle 被激活,正在運(yùn)行中),uninstalled(Bundle 被卸載了)。OSGi 有它自身的類(lèi)加載機(jī)制從而控制這些加載的Bundles 彼此之間的依賴(lài)關(guān)系,而生命周期管理也是OSGi 的一大亮點(diǎn),由于可動(dòng)態(tài)的對(duì)這些加載的Bundles 進(jìn)行安裝、卸載、啟動(dòng)、停止等操作,所以可以動(dòng)態(tài)的改變應(yīng)用程序的運(yùn)行狀態(tài)。當(dāng)一系列的Bundles 存在于服務(wù)器中的時(shí)候,那么它們之間必然會(huì)存在通信協(xié)作的部分,比如說(shuō)一個(gè)通過(guò)網(wǎng)頁(yè)捕獲用戶(hù)輸入的Bundle 執(zhí)行的時(shí)候,它必須首先需要一個(gè)Web 服務(wù)器服務(wù)的支持,那么這個(gè)時(shí)候服務(wù)注冊(cè)器就會(huì)從整個(gè)OSGi容器中尋找這個(gè)服務(wù),如果能完成服務(wù)的匹配,那么相應(yīng)的功能就會(huì)很自然的實(shí)現(xiàn)了。OSGi 規(guī)范還規(guī)定了一組預(yù)設(shè)的服務(wù),包括日志、服務(wù)管理等等,這些服務(wù)在主流的開(kāi)源框架中都有實(shí)現(xiàn)。OSGi 框架中還包括一個(gè)安全層,OSGi 的安全層擴(kuò)展了Java 的安全機(jī)制,增并加了一些新的約束以填補(bǔ)了Java安全機(jī)制中的遺漏。

#p#

基于上述的介紹,讀者想必應(yīng)對(duì)OSGi 有個(gè)大致的概念了,那么接下來(lái)就讓我們來(lái)看看OSGi 究竟能夠給企業(yè)應(yīng)用帶來(lái)什么?它究竟有哪些功能值得我們把寶貴的時(shí)間投資在上面?

第一點(diǎn),也是筆者認(rèn)為最重要的一點(diǎn),基于OSGi 的應(yīng)用程序可動(dòng)態(tài)更改運(yùn)行狀態(tài)和行為。筆者曾經(jīng)參與過(guò)開(kāi)發(fā)J2EE 企業(yè)級(jí)項(xiàng)目,應(yīng)用服務(wù)器用的是IBM 的Websphere,主要開(kāi)發(fā)基于EJB 2.1 的一些應(yīng)用程序。整個(gè)開(kāi)發(fā)經(jīng)歷給筆者的最深印象是等待,排除編寫(xiě)EJB 規(guī)范中要求的一系列繁雜的接口,單單對(duì)應(yīng)用程序進(jìn)行部署和測(cè)試,反復(fù)啟動(dòng)服務(wù)器就浪費(fèi)掉很多時(shí)間。而在OSGi 框架中,每一個(gè)Bundle 實(shí)際上都是可熱插拔的,因此,對(duì)一個(gè)特定的Bundle 進(jìn)行修改不會(huì)影響到容器中的所有應(yīng)用,運(yùn)行的大部分應(yīng)用還是可以照常工作。當(dāng)你將修改后的Bundle 再部署上去的時(shí)候,容器從來(lái)沒(méi)有重新啟過(guò),在外界看來(lái),這種過(guò)程似乎從未發(fā)生過(guò)。這種可動(dòng)態(tài)更改狀態(tài)的特性在一些及時(shí)性很強(qiáng)的系統(tǒng)中尤其重要,比如說(shuō)一個(gè)及時(shí)銷(xiāo)售系統(tǒng),當(dāng)你的服務(wù)器因?yàn)橐履硞€(gè)組件從而花上數(shù)分鐘時(shí)間重新啟動(dòng)的話(huà),必然導(dǎo)致客戶(hù)的流失和利益的損失,但是采用OSGi 架構(gòu)的應(yīng)用則完全可以將損失降到最低。眾所周知,Spring 框架以其優(yōu)秀的特性,占據(jù)了當(dāng)前企業(yè)應(yīng)用開(kāi)發(fā)的半邊天空,而剛剛發(fā)布的2.5 版本,宣布所有jar 包均支持OSGi 特性,其維護(hù)的子項(xiàng)目Spring-OSGi 也是專(zhuān)門(mén)針對(duì)Spring 與OSGi 的集成。Spring 早前版本有一點(diǎn)被人所詬病,就是其無(wú)法動(dòng)態(tài)的改變其運(yùn)行狀態(tài),被迫停止服務(wù)器,再修改配置文件,而與OSGi 的結(jié)合,必然導(dǎo)致這種狀態(tài)的終結(jié)。最后,筆者認(rèn)為這種特性也保證了系統(tǒng)有足夠的靈活性和可擴(kuò)展性,對(duì)開(kāi)發(fā)人員也大大節(jié)省了需要等待的時(shí)間。

第二點(diǎn),它是一個(gè)穩(wěn)定高效的系統(tǒng)。OSGi 是一個(gè)微核的系統(tǒng),所謂微核是指其核心只有為數(shù)不多的幾個(gè)jar 包。基于OSGi 框架的系統(tǒng)可分可合,其結(jié)構(gòu)的優(yōu)勢(shì)性導(dǎo)致具體的Bundle 不至于影響到全局,不會(huì)因?yàn)榫植康腻e(cuò)誤導(dǎo)致全局系統(tǒng)的崩潰。每個(gè)Bundle 也只有當(dāng)服務(wù)被調(diào)用的時(shí)候才會(huì)啟動(dòng),因此性能是較一般的框架高出許多。

第三點(diǎn),可復(fù)用性強(qiáng)。OSGi 框架本身可復(fù)用性極強(qiáng),很容易構(gòu)建真正面向接口的程序架構(gòu),每一個(gè)Bundle 都是一個(gè)獨(dú)立可復(fù)用的單元。但是采用OSGi 框架進(jìn)行企業(yè)開(kāi)發(fā)是需要?dú)馄呛陀職獾模驗(yàn)楫?dāng)前的軟件企業(yè),大多已經(jīng)積累了許多年,都會(huì)遺留下來(lái)一些可復(fù)用的工具箱程序,而采用OSGi 架構(gòu)需要重新對(duì)這些遺留系統(tǒng)進(jìn)行封裝,更有可能的是需要把整個(gè)體系架構(gòu)打散了,進(jìn)行重新的架構(gòu)和排列。這個(gè)開(kāi)發(fā)成本不能說(shuō)是不高,但筆者認(rèn)為是值得的,因?yàn)閺拇艘院笃髽I(yè)可以利用OSGi 獨(dú)特的特性,將重復(fù)的知識(shí)輕易的過(guò)濾掉。對(duì)于新的開(kāi)發(fā),可以從企業(yè)的Bundles 庫(kù)中精簡(jiǎn)出可復(fù)用的模塊,量身定做新的Bundles,最大限度的利用了以前的積累,這樣的過(guò)程更能促使企業(yè)競(jìng)爭(zhēng)力的增強(qiáng)。

OSGi 開(kāi)源框架介紹

當(dāng)前的OSGi 開(kāi)源框架主要包含如下幾個(gè):

Equinox

最知名,也是更新最頻繁的,由于Eclipse 基金的支持,其功能越來(lái)越完善,筆者后續(xù)的具體開(kāi)發(fā)都是基于該框架來(lái)實(shí)現(xiàn)的。當(dāng)前已發(fā)布版本是3.3.1 與Eclipse 版本相同,實(shí)現(xiàn)了OSGi R4 規(guī)范,并提供很多平臺(tái)性質(zhì)的服務(wù),包括:常用功能模塊、日志模塊、Web服務(wù)器模塊、Servlet 模塊、JSP 解析模塊等等。由于其與Eclipse 的天然聯(lián)系,使得開(kāi)發(fā)基于Equinox 的應(yīng)用程序變得很簡(jiǎn)單,筆者推薦采用此框架進(jìn)行二次開(kāi)發(fā)。具體內(nèi)容可以從http://www.eclipse.org/equinox/ 下載。

Knopflerfish

很早的,也很優(yōu)秀的一個(gè)OSGi 框架,也實(shí)現(xiàn)了OSGi R4 標(biāo)準(zhǔn),去年十一月發(fā)布了其2.0.2版本。該項(xiàng)目的宗旨在于創(chuàng)建一個(gè)易于開(kāi)發(fā)的OSGi 平臺(tái),與Equinox 不同之處在于它本身提供一些小應(yīng)用實(shí)例,包括一個(gè)可視化控制臺(tái)等,也提供基于Eclipse 的插件。具體內(nèi)容可以從http://www.knopflerfish.org/ 下載。

Felix

很新的一個(gè)OSGi 框架,社區(qū)很活躍,更新頻率高,是Apache 的開(kāi)源項(xiàng)目。該項(xiàng)目2007年8月才出1.0 版,也實(shí)現(xiàn)了OSGi R4 規(guī)范,也提供相關(guān)的基礎(chǔ)服務(wù)和擴(kuò)展服務(wù)功能。具體內(nèi)容可以從http://felix.apache.org/site/index.html 下載。

OSGi 開(kāi)發(fā)環(huán)境部署

講了那么多原理,如果不動(dòng)手實(shí)踐一下,總是難以令人信服的。那么現(xiàn)在我們就開(kāi)始動(dòng)手搭建開(kāi)發(fā)環(huán)境吧。

首先,你需要準(zhǔn)備好Eclipse 筆者用的是Eclipse 3.3.1 ,還有從Equinox 網(wǎng)站上下載到的Equinox SDK。

其次,將Equinox SDK 解壓,解壓后是一個(gè)Eclipse 目錄,將該目錄下的所有內(nèi)容拷貝至你的Eclipse 安裝目錄下,就像平時(shí)手動(dòng)安裝Eclipse 插件一樣。

最后,測(cè)試下是否安裝成功。啟動(dòng)你的Eclipse,選擇Run>Open Run Dialog...在彈出的界面中,如果出現(xiàn)了OSGi Framework 的選項(xiàng),那基本上就是成功了。點(diǎn)擊新建一個(gè)OSGi Run方式,這時(shí)會(huì)列出一系列的加載組件,你可以檢查一下,如果里面有org.eclipse.osgi ,org.eclipse.osgi.services 和一系列以org.eclipse.equinox 開(kāi)頭的組件,那么就真的安裝成功了。選中org.eclipse.osgi 和org.eclipse.osgi.services,點(diǎn)擊Run 按鈕,控制臺(tái)會(huì)出現(xiàn)“osgi>”的提示,輸入“ss”,就會(huì)看到你運(yùn)行的這兩個(gè)Bundles 的ID和狀態(tài)了。每次輸入錯(cuò)誤的時(shí)候,控制臺(tái)會(huì)打印出完整的命令列表,讀者可以在此參考。#p#

OSGi 版HelloWorld

到了真的寫(xiě)一個(gè)HelloWorld 的時(shí)候了,該應(yīng)用設(shè)計(jì)如下圖:

 這個(gè)應(yīng)用包含五個(gè)Bundles:SayHello Bundle 包含一個(gè)接口,只有唯一的方法sayHello();BobSays、RodSays、KentSays 三個(gè)Bundles 分別實(shí)現(xiàn)了三個(gè)具體的sayHello();而SayHelloService Bundle 提供了說(shuō)hello 的機(jī)會(huì),是具體的一個(gè)服務(wù)應(yīng)用,在功能上有點(diǎn)類(lèi)似于main 函數(shù)的味道。這個(gè)HelloWorld demo 的目的不但可以讓讀者小試牛刀,而且可以同時(shí)體會(huì)一下OSGi 最大的優(yōu)點(diǎn)——服務(wù)狀態(tài)的可更改性。BobSays、RodSays、KentSays 實(shí)現(xiàn)了SayHello 暴露的接口,它們是sayHello 的具體執(zhí)行者,但是在SayHelloService 調(diào)用的過(guò)程中,我們可以動(dòng)態(tài)的改變到底是誰(shuí)來(lái)說(shuō)。為了實(shí)現(xiàn)這個(gè)demo,還需要簡(jiǎn)單介紹一下OSGi 最簡(jiǎn)單的實(shí)現(xiàn)機(jī)制:OSGi Bundles 之間包的依賴(lài)關(guān)系。每一個(gè)OSGi Bundle 的類(lèi)文件可分為私有的、引入的、暴露的三種,如下圖所示

在OSGi 中Exported Classes 是以包的方式暴露的,如圖所示,SayHello 中暴露了接口所在的包,對(duì)應(yīng)的BobSays等三個(gè)Bundles 和SayHelloService Bundle 都引入了該包,這是OSGi 中最簡(jiǎn)單的通信方式,OSGi 規(guī)范中推薦使用面向服務(wù)的通信方式,這里只是舉一個(gè)簡(jiǎn)單的實(shí)例,因此不用做的那么復(fù)雜。
 
回到正題,啟動(dòng)你的Eclipse,新建一個(gè)名為SayHello 的plug-in project,在Target Platform 選項(xiàng)中,選擇an OSGi Framework:Equinox。筆者自己設(shè)置了Activator 路徑為org.osgi.demo.sayHello.Activator,每個(gè)Activator 都具有兩個(gè)方法,start() 和 stop(),這兩個(gè)方法是該bundle 啟動(dòng)、停止的時(shí)候,調(diào)用的方法,通常在這里注冊(cè)、初始化或注銷(xiāo)該Bundle 服務(wù)的過(guò)程,這里不需要更改任何Activator 中的內(nèi)容,用系統(tǒng)自動(dòng)生成的就可以了。在建立好項(xiàng)目后,會(huì)出現(xiàn)對(duì)SayHello 項(xiàng)目的配置,這里可以通過(guò)dependencies 選項(xiàng)卡,設(shè)置需要的plug-in 和引入的package;可以通過(guò)runtime 選項(xiàng)卡的設(shè)置,確定暴露哪些包。我們新建一個(gè)org.osgi.demo.say 包,并建立SayHello 接口,只有一個(gè)返回void的方法sayHello() ,并將此包設(shè)為暴露的。這些設(shè)置都保存在項(xiàng)目的META-INF目錄下的MANIFEST.MF文件中,以后要更改的話(huà),只需打開(kāi)該文件即可。 SayHello 接口的代碼如下:

public interface SayHello {
    public void sayHello();
}

同樣類(lèi)似的新建一個(gè)名為BobSays 的plug-in project。筆者設(shè)置的包為org.osgi.demo.bob,這里需要在配置dependencies 的時(shí)候,將包org.osgi.demo.say 引入。創(chuàng)建新的類(lèi)BobSays,代碼如下:

public class BobSays implements SayHello {
    public void sayHello() {
        System.out.println("Bob says \"Hello OSGi world\"");
    }
}

這里需要覆寫(xiě)在BobSays Bundle 中的Activator 的兩個(gè)方法,具體代碼如下:

public class Activator implements BundleActivator {

    private ServiceRegistration serviceReg = null;


    public void start(BundleContext context) throws Exception {
        serviceReg = context.registerService(SayHello.class.getName(),
                new BobSays(), null);// 1
    }

    public void stop(BundleContext context) throws Exception {
        if (serviceReg != null)
            serviceReg.unregister();// 2
    }
}

完成的主要功能是:1、在啟動(dòng)服務(wù)的時(shí)候,注冊(cè)BoySays 服務(wù)為一個(gè)SayHello 服務(wù);2、在停止服務(wù)的時(shí)候,從上下文中卸載該服務(wù)。

類(lèi)似的創(chuàng)建KentSays、RodSays 兩個(gè)project。

最后,創(chuàng)建一個(gè)名為SayHelloService 的plug-in project。筆者設(shè)置的包為org.osgi.demo.service,同樣在配置dependencies 的時(shí)候,將包org.osgi.demo.say 引入。創(chuàng)建SayHelloService類(lèi),代碼如下:

public class SayHelloService {

    private SayHello say;

    public void helloWorld() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.err.println("Thread can't sleep");
            }
            say.sayHello();
        }
    }

    public void setSay(SayHello say) {
        this.say = say;
    }
}

這里采用依賴(lài)注入的方式,所以有一個(gè)setSay() 方法,來(lái)設(shè)置一個(gè)具體的SayHello。helloWorld() 方法就是調(diào)用特定的SayHello.sayHello() 來(lái)完成的,用10秒鐘的時(shí)間打印十次sayHello() 的具體內(nèi)容。該Bundle 的Activator 代碼如下:

public class Activator implements BundleActivator {

    private ServiceRegistration serviceReg = null;

    public void start(BundleContext context) throws Exception {
        SayHelloService sayService = new SayHelloService();
        serviceReg = context.registerService(SayHelloService.class.getName(),
                sayService, null);// 1
        ServiceReference serviceRef = context
                .getServiceReference(SayHello.class.getName());// 2
        sayService.setSay((SayHello) context.getService(serviceRef));// 2
        sayService.helloWorld();// 3
    }


    public void stop(BundleContext context) throws Exception {
        if (serviceReg != null)
            serviceReg.unregister();
    }
}

完成的主要功能是:1、注冊(cè)SayHelloService 服務(wù);2、獲取一個(gè)的SayHello 服務(wù);3、并注入到SayHelloService 服務(wù)中,現(xiàn)在注入的服務(wù)是從服務(wù)上下文中具體獲取的,而到底是哪個(gè),只有在運(yùn)行時(shí)狀態(tài)才能決定。

至此,所有的Bundles 我們都已經(jīng)完成了,選擇Open Run Dialog...,并選中上述五個(gè)Bundles 和OSGi 核心Bundle,點(diǎn)擊Run 按鈕。輸入“ss”,列出了6個(gè)Bundles 的狀態(tài),此時(shí),如果你的SayHelloService Bundle 狀態(tài)是Resolved,那么你可以通過(guò)命令“start ‘SayHelloService Bundle 狀態(tài)的id’”,啟動(dòng)SayHelloService,此時(shí)你會(huì)看到打印出的10條hello world信息。讀者可以手動(dòng)利用用命令“start” 和“stop” 改變sayHello 的具體執(zhí)行者,動(dòng)態(tài)的更換實(shí)際sayHello 的執(zhí)行者。這個(gè)簡(jiǎn)單的HelloWorld 應(yīng)用,可以說(shuō)明SayHelloService 在具體執(zhí)行的過(guò)程中行為是可動(dòng)態(tài)改變的,并且改變只是局部的。

小結(jié)

讀完本文,實(shí)際動(dòng)手做過(guò)HelloWorld,想必讀者對(duì)OSGi 框架也應(yīng)該有所了解了,OSGi 框架在國(guó)外關(guān)注率是挺高的,但是在國(guó)內(nèi)的推廣和使用卻不夠廣泛,可能是因?yàn)镺SGi 字面上的意思太過(guò)于抽象,因此筆者在這里將這個(gè)優(yōu)秀的框架介紹給大家,本片只是一個(gè)簡(jiǎn)單的介紹,并不涉及OSGi 框架深入的知識(shí)。

【編輯推薦】

  1. 探索Eclipse的OSGi控制臺(tái)
  2. OSGi企業(yè)級(jí)分布式ModuleFusion1.0.1發(fā)布
  3. OSGi和未來(lái)Java企業(yè)開(kāi)發(fā)的方向
責(zé)任編輯:佚名 來(lái)源: 51CTO.com
相關(guān)推薦

2010-03-29 17:05:07

OSGi

2009-03-30 09:42:28

OSGiJavaJCP

2009-08-21 13:55:05

企業(yè)級(jí)Java云云工廠SpringSourc

2010-04-07 08:55:00

OSGiSpring

2013-10-18 11:01:30

OpenStack云計(jì)算開(kāi)源

2011-07-05 14:07:36

2021-06-14 09:46:11

開(kāi)源混合云云計(jì)算

2016-09-12 10:21:40

2011-08-15 16:02:15

OpenNMS網(wǎng)管軟件

2014-01-09 14:01:20

開(kāi)源CentOS紅帽

2013-12-10 21:39:14

CentOS 6.5CentOS

2018-11-20 09:35:42

開(kāi)源技術(shù) 數(shù)據(jù)

2022-06-18 18:18:43

紅帽開(kāi)源混合云

2009-01-13 09:05:45

tomcatSpring框架Web服務(wù)器

2018-02-02 11:21:25

云計(jì)算標(biāo)準(zhǔn)和應(yīng)用大會(huì)

2014-09-24 13:32:41

企業(yè)號(hào)

2010-08-04 15:20:15

Flex企業(yè)級(jí)開(kāi)發(fā)

2012-06-14 13:26:22

2013-05-06 14:34:42

開(kāi)源Linux 6.3紅帽企業(yè)級(jí)Linux

2014-12-03 11:41:19

企業(yè)級(jí)技術(shù)技術(shù)趨勢(shì)2015年
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 美女黄色在线观看 | 国产精品久久久久久久久久久免费看 | 中文字幕在线观看视频一区 | 午夜精品91| 精久久久久 | 日韩成人在线观看 | 91 久久| 最新国产在线 | 精品久久久久一区二区国产 | 中文字幕一区二区三区在线视频 | 日日夜夜天天综合 | 欧美日韩在线国产 | av色在线| 亚洲天天干 | 欧美精品欧美精品系列 | 不卡一区二区三区四区 | 99热播精品| 国产女人与拘做视频免费 | 一区二区国产精品 | 亚洲视频欧美视频 | julia中文字幕久久一区二区 | 国产精品久久性 | 国产成人精品免费 | 精品久久久久一区二区国产 | 精品亚洲一区二区三区 | 欧美在线视频网站 | 成人免费视频观看视频 | 成人久久久久 | av先锋资源| 日本高清视频在线播放 | 91亚洲国产成人精品一区二三 | 亚洲欧美视频一区 | 午夜寂寞福利视频 | 视频一区二区中文字幕 | 国产精品黄色 | 亚洲国产精品一区 | 日本精品久久 | 国产精品一区二区视频 | 欧美日韩激情 | 欧美中文一区 | 欧美色专区 |