




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
OSGI文檔整理創(chuàng)建人何釗聯(lián)系方式1439293823(QQ)創(chuàng)建時間2017/04/01目錄TOC\o"1-5"\h\z\o"CurrentDocument"OSGI文檔整理1創(chuàng)建人1何釗1聯(lián)系方式11439293823(QQ)1創(chuàng)建時間12017/04/011\o"CurrentDocument"定義3OSGI框架3\o"CurrentDocument"模塊和模塊化3\o"CurrentDocument"構(gòu)成4定義OSGI(OpenServiceGatewayInitiative)技術(shù)是面向Java的動態(tài)模型系統(tǒng)。OSGI框架實現(xiàn)了一個優(yōu)雅、完整和動態(tài)地組件模型。應(yīng)用程序(bundle)無需重新引導(dǎo)可以被遠(yuǎn)程安裝、啟動、升級和卸載。OSGi技術(shù)提供允許應(yīng)用程序使用精煉、可重用和可協(xié)作的組件構(gòu)建的標(biāo)準(zhǔn)化原語。這些組件能夠組裝進(jìn)一個應(yīng)用和部署中。OSGi服務(wù)平臺提供在多種網(wǎng)絡(luò)設(shè)備上無需重啟的動態(tài)改變構(gòu)造的功能。為了最小化耦合度和促使這些耦合度可管理,OSGi技術(shù)提供一種面向服務(wù)的架構(gòu),它能使這些組件動態(tài)地發(fā)現(xiàn)對方。OSGi聯(lián)盟已經(jīng)開發(fā)了例如像HTTP服務(wù)器、配置、日志、安全、用戶管理、XML等很多公共功能標(biāo)準(zhǔn)組件接口。這些組件的兼容性插件實現(xiàn)可以從進(jìn)行了不同優(yōu)化和使用代價的不同計算機(jī)服務(wù)提供商得到。然而,服務(wù)接口能夠基于專有權(quán)基礎(chǔ)上開發(fā)。OSGi的主要職責(zé)就是為了讓開發(fā)者能夠創(chuàng)建動態(tài)化、模塊化的Java系統(tǒng)。OSGI框架模塊和模塊化模塊(module):定義了一個邏輯邊界,這種模塊本身精確的控制了哪些類是完全被封裝起來的,而哪些類需要暴出來作為外部使用。模塊化(modularity):將一個大型系統(tǒng)分解為多個較小的互相協(xié)作的邏輯單元,通過強(qiáng)制設(shè)置模塊之間的邏輯邊界來改善系統(tǒng)的維護(hù)性和封裝性。構(gòu)成OSGi框架從概念上可以分為三層:模塊層、生命周期層和服務(wù)層。ModuleLayer:模塊層關(guān)注代碼的打包和共享;LifecycleLayer:生命周期層提供運行時管理以及對OSGI框架的訪問接口;模塊層模塊層是OSGi框架中最基礎(chǔ)的部分。OSGi的模塊化,是通過為Jar包添加metadata來定義哪些類該暴露,哪些類該隱藏,其控制單元叫做Bundle(jar包)。首先,必須先了解一個基本概念一一什么是Bundle?bundle是以jar包形式存在的一個模塊化物理單元,里面包含了代碼,資源文件和元數(shù)據(jù)(metadata),并且jar包的物理邊界也同時是運行時邏輯模塊的封裝邊界。如何定義BundleBundle是OSGi中的基本組件,其表現(xiàn)形式仍然為Java概念中傳統(tǒng)的Jar包。通過META-INF目錄下的MANIFEST.MF文件對其予以進(jìn)一步的定義。通常一個MANIFEST.MF文件的內(nèi)容如下:Manifest-Version:1.0Bundle-ManifestVersion:2Bundle-Name:UtilBundle-SymbolicName:com.ibm.director.la.utilBundle-Version:1.0.0Bundle-RequiredExecutionEnvironment:J2SE-1.5Import-Package:org.osgi.framework;version="1.3.0"Export-Package:com.ibm.director.la.util;uses:="org.osgi.framework"Bundle-ClassPath:lib/junit.jar,MANIFEST.MF文件存儲的實際上是Bundle的元數(shù)據(jù)。元數(shù)據(jù)的內(nèi)容可以精確的定義Bundle的各種特征,同時能更好的對Bundle進(jìn)行標(biāo)識同時幫助用戶對Bundle進(jìn)行理解。MANIFEST.MF文件格式屬性聲明的一般格式:name:value一行不超過72個字符,下一行繼續(xù)則由單個空格字符開始每個子句(clause)進(jìn)一步分解為一個目標(biāo)(target)和一組由分號分隔的name-value對參數(shù)(parameter)元素解釋:Bundle-SymbolicName唯一的bundle名稱,相當(dāng)于在系統(tǒng)中的id。singleton表示是否使用單啟動方式#可選的Bundle-Version主要的版本號Bundle-ManifestVersion定義了bundle遵循規(guī)范的規(guī)則,1表示r3規(guī)范2表示r4和以后的版本a)唯一有效的值是2b)沒有Bundle-ManifestVersion的Bundle不要求指定Bundle-SymbolicName屬性Bundle-Namebundel名稱Bundle-Vendor發(fā)布商Bundle-RequiredExecutionEnvironment需要的執(zhí)行環(huán)境Build-Jdkjdk版本Created-By創(chuàng)建者Bundle-ActivatorActivator類路徑Import-Package引用包的信息,包括包名稱和版本號,只有引用了這些包,才能讓classloader裝載a)導(dǎo)入一個包并沒有導(dǎo)入它的子包b)Import-Package通過屬性導(dǎo)入特定的包c)除java.*d)對于任意屬性,OSGI只支持相等匹配e)Version及其值的格式是OSGI規(guī)范所定義,支持更加靈活的匹配方法語法含義''[rnin.rnaxj"min<x<max^mln.maxF1minWxWmax"(min.maxl"min<x<max”(min,max]"min<kWmax"mln11minf)需要指定一個精確的版本范圍,使用“[1.0.1,2.0.1]”這樣的格式g)當(dāng)沒有指定版本范圍時,默認(rèn)的值是“0.0.0”Export-Package對外暴露的Packagea)標(biāo)準(zhǔn)Jar文件默認(rèn)公開一切內(nèi)容,而Bundle中默認(rèn)不公開任何內(nèi)容b)可導(dǎo)出多個包,用逗號分隔c)可以給導(dǎo)出包增加任意屬性d)可以給導(dǎo)出包設(shè)置Version,默認(rèn)為0.0.0Require-Bundle直接引用整個bundleBundle-ClassPathBundle的Classpath,內(nèi)部類路徑Fragment-HostFragment類型Bundle所屬的Bundle名DynamicImport-PackageBundle動態(tài)引用的packageOSGI類的查找順序如果類所在的包以“java.〃開頭,委托給父類加載器如果類所在的包在導(dǎo)入包中,委托給導(dǎo)出該包的Bundle在Bundle自身的類路徑上查找依賴解析含義只有滿足所有的依賴(Import-Package),bundle才可用OSGI框架的一個最重要任務(wù)之一就是:通過自依賴解析自動化地進(jìn)行依賴管理依賴解析規(guī)則級聯(lián)解析Import-Package的屬性約束和版本約束多個Bund滿足Import-Package依賴(多個Provider)時:3.1已解析的(resolved)bundle優(yōu)先級高,未解析的(installed)bundle優(yōu)先級低3.2相同優(yōu)先級,有多個匹配時,版本高者優(yōu)先,版本相同則選最先安裝的bundle一個bundle只能看到某個package的唯一一個實例uses子句5.1用于限制Export-Package5.2需要用到uses子句的場景5.2.1導(dǎo)出包中的類,其方法簽名中包含了其Import-Package中的類5.2.2導(dǎo)出包中的類,繼承了其Import-Package中的類5.3users約束是可傳遞的5.4謹(jǐn)慎使用uses,大大?限制解析的靈活性生命周期層作用在應(yīng)用程序外部,生命周期層精確低定義了對bundle生命周期的相關(guān)操作對生命周期的操作,允許你動態(tài)地改變進(jìn)行于框架中的bundle組成,并以此來管理和演化應(yīng)用程序在應(yīng)用程序內(nèi)部,生命周期層定義了bundle訪問其執(zhí)行上下文的方式,為bundle提供了一種與OSGI框架交互的途徑以及一些執(zhí)行時的便利條件OSGI框架支持對bundle形式的JAR文件實現(xiàn)全生命周期管理,包括:安裝、解析、啟動、停止、更新和卸載運行時生命周期管理,“動態(tài)類路徑”下圖為Bundle生命周期的狀態(tài)轉(zhuǎn)移圖:installupdate
refreshQJlrtJpdnip電startupdate
refreshQJlrtJpdnip電start重要接口生命周期層的API主要是由以下三個核心接口來組成的:BundleActivator,BundleContext和Bundle。BundleActivator:讓你能夠捕捉bundle的start和stop事件,并對這兩個事件作出自定義的反應(yīng)。其中:調(diào)用start()方法的激活器實例與調(diào)用stop()的實例是同一個當(dāng)stop()方法被調(diào)用之后,激活器實例就被丟棄并不再不用如果一個bundle被停止后,又重新啟動,那么將創(chuàng)建一個新的激活器實例,同時它的start()方法和stop()方法也將被適時觸發(fā)。BundleContext:一個bundle在框架中的執(zhí)行時上下文,這個上下文提供了和框架進(jìn)行交互的方法。其中:在bundle屬于active狀態(tài)時,BundleContext才有意義,即start()方法被調(diào)用和stop()方法被調(diào)用之間的時間點注冊服務(wù):方法如下:publicServiceRegistrationregisterService(Stringclazz,Objectservice,Dictionaryproperties);調(diào)用例子:@Overridepublicvoidstart(BundleContextcontext)throwsException{Dictionary<String,String>props=newHashtable<String,String>();props.put("ServiceName","Calculation");context.registerService(ICalculation.class.getName(),newCalculation(),props);System.out.println("Serviceregistered!");}3獲取服務(wù):有幾種方式:1、ServiceReferenceref=context.getServiceReference(LogService.class.getName());優(yōu)點:很難說有什么優(yōu)點,硬要說幾句的話,那就是邏輯夠簡單,調(diào)用最少,適合一次性操作。缺點:需要判斷返回值是否為null,需要手動申請和釋放service,由于OSGi的動態(tài)性,請在獲取ref后盡快使用,無法保證ref長期有效。每次訪問都會有service獲取和釋放的開銷。用途:適合于不頻繁的調(diào)用service,且在service不可用時也能繼續(xù)執(zhí)行后續(xù)操作的場景。2、使用ServiceListener優(yōu)點:只在Service變更時產(chǎn)生一次service獲取開銷,動態(tài)感知service的注冊和注銷。缺點:在ServiceListener注冊之前已經(jīng)存在的Service無法監(jiān)聽到。需要自己維護(hù)service的獲取和釋放。在需要監(jiān)聽多個Service實例時,使用并不方便。3、使用ServiceTrackerServiceTracker其實是對ServiceListener實現(xiàn)方式的封裝,使得對service的獲取更加簡潔,同時也解決了不能監(jiān)聽到已經(jīng)存在的Service的問題(其實就是在增加ServiceListener的同時調(diào)用BundleContext.getAllServiceReferences方法以獲取現(xiàn)有的Service引用)。有一點需要注意的是,tracker需要調(diào)用open方法才能監(jiān)聽到Service,另外,在bundlestop以后,bundle內(nèi)open的ServiceTracker不會自動關(guān)閉,所以一定不要忘記在bundle結(jié)束之前,關(guān)閉所有在bundle中open的ServiceTracker。4、使用OSGIBlueprint如下]也tncodl(ig='yrF-s7>1<blu^prlntxnlns=Myi-ortnt/v2-KiiLns:(£1=「恥甲.'//gw.w5.-instdflce"KEi:EchenaLoeatians'ihttprZ/h&w.aE^iJiVbLueprint/v2.山&osgi一orgfxmlnB/blueprintJul.0/tiLheprint..4曰.用用#眼<re^re-nceId-"ctflcutotiiwiuIn我H就屯?>頃-叫n亦r決期l岫討觀;LMmmS找綁Tfilter-YServit"&<1--<beartclasi="ctiflapiMid'ET.Deiso-dems?.Lu[usprintn>cprqjertynane-'cHicuio+ar"fltionservi|11</(?luteprint>
Bundle:在邏輯上表示了一個bundle,OSGi環(huán)境中的一個物理bundle對應(yīng)了一個bundle對象。該對象中包含了bundle的基本信息和bundle生命周期的控制接口。Bundle的邏輯表示■Bundle爭定義了一系列API,用于管理已安裝的bundle的生命周期>獲取Bundle信息■修改Bundle狀態(tài)publicinterface{H?點^丁頌摭eg料刑兩<J;如tg閔現(xiàn)汕Hdf.K>獲取Bundle信息■修改Bundle狀態(tài)inf^fStatef^$/ritr^);vm弟n帶磯電/油網(wǎng)o;vcHMwhnHfhBMdieExceptian;v&idstartsBUHdleExeepthn;vak!礎(chǔ)叩WHapiiotfsithrowsBufidfeEweplio^;widatopfjtfmws8叫獨&葉即宙町;voidupfijatefbipuiSi^mmpm)ihmvsBuncHeETcepftoH;vol』烷pda怔fjlhrtm島BuniilcEjcmplitm;miduHinstallf)thrownBunclieExceptim;京大學(xué)繇件二棵國家工程研箕中。啟動級別1、啟動級別的數(shù)值越高,啟動順序越靠后2、只有SystemBundle(bundleID為0)的啟動級別可以為0,其他Bundle的啟動級別都大于0,最大值為Integer.MAX_VALUE3、動態(tài)啟動級別系統(tǒng)Bundle啟動過程:Bundle的start()方法為空操作,因為OSGI框架一啟動。系統(tǒng)Bundle就已經(jīng)啟動了停止過程:Bundle的stop()方法會立即返回并在另外一條線程中關(guān)閉OSGI框架更新過程:Bundle的update()方法會立即返回并在另外一條線程中重啟OSGI框架卸載過程:系統(tǒng)Bundle無法卸載,如果執(zhí)行了Bundle的uninstall()方法,那么框架會拋出一個BundleException異常
Bundle刷新流程從某一bundle開始計算受影響的bundle有向圖處于Active狀態(tài)的bundle被停止并被切換至Resolved狀態(tài)處于Resolved狀態(tài)的bundle,切換至Installed狀態(tài),這些bundle的依賴關(guān)系不再被解析處于uninstalled狀態(tài)的bundle會被從圖中移除,同時也會被徹底地從框架中移除(由GC回收)其他bundle,如果框架重啟之前處于Active狀態(tài),重啟前框架會
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度股東間知識產(chǎn)權(quán)共享合作協(xié)議書
- 二零二五年度農(nóng)村自建房拆房與農(nóng)村人才引進(jìn)合作協(xié)議
- 二零二五年度食用農(nóng)產(chǎn)品質(zhì)量安全監(jiān)測與信息發(fā)布協(xié)議
- 二零二五年度房產(chǎn)出售獨家代理授權(quán)書
- 二零二五年度建筑工程質(zhì)量監(jiān)管合同模板
- 二零二五年度車輛剮蹭私下賠償執(zhí)行協(xié)議
- 2025年度股權(quán)代持信托協(xié)議書:Q股東代持R公司股權(quán)的信托管理合同
- 2025年度砂石料電商倉儲配送合作協(xié)議
- 二零二五年度個人隱私信息保密管理協(xié)議
- 二零二五年度公園游樂設(shè)施護(hù)欄安裝合同
- 2025年哈爾濱幼兒師范高等??茖W(xué)校單招職業(yè)技能測試題庫學(xué)生專用
- 第10章 浮力較難2 難題練習(xí) 2021年初中物理培優(yōu)(重點高中自主招生 競賽)
- 計算機(jī)一級測試題(附參考答案)
- 企業(yè)內(nèi)部系統(tǒng)使用權(quán)限規(guī)范
- 教學(xué)課件-液壓與氣壓傳動項目教程(侯守軍)
- 2024年亳州職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫
- 2025年旅行與旅游的未來:擁抱可持續(xù)與包容性增長報告(英文版)-世界經(jīng)濟(jì)論壇
- DB65T 8022-2024 嚴(yán)寒和寒冷地區(qū)居住建筑節(jié)能設(shè)計標(biāo)準(zhǔn)
- 《質(zhì)子治療技術(shù)》課件
- 醫(yī)院影像科服務(wù)質(zhì)量提升措施
- 2024年中國疾控中心信息中心招聘筆試真題
評論
0/150
提交評論