<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    OSGi R4.2 public draft中新增加的Framework launch

    這是Lifecycle Layer中的最大改進(jìn),在之前的規(guī)范中只是簡單的描述了下框架的啟動和關(guān)閉,在制定了這個規(guī)范后,以后無論是啟動equinox還是felix,都可采用同樣的方式啟動,詳細(xì)的來看看,本文摘自《OSGi原理與最佳實踐》。

    首先來看看外部應(yīng)用如何通過FrameworkAPI來實現(xiàn)Framework的啟動,來看張啟動方法的時序圖先:


    這個時序圖完整的說明了如何通過FrameworkAPI來實現(xiàn)OSGi Framework的啟動和停止:

    n  調(diào)用FrameworkFactorynewFramework方法

    所有OSGi的實現(xiàn)都必須實現(xiàn)FrameworkFactory接口,此接口中只有一個方法,即newFramework(Map configuration),外部容器在實例化FrameworkFactory實現(xiàn)對象上有兩種做法:

    A.        Class.forName(FrameworkFactory實現(xiàn)類).newInstance()

    B.        通過Java 6中提供的ServiceLoader尋找并加載FrameworkFactory的實現(xiàn)類,使用方法為:

    假設(shè)com.acme.osgi.FactoryFrameworkFactory的實現(xiàn)類,那么則在META-INF下新建services目錄,在此目錄下建立一個org.osgi.framework.launch.FrameworkFactory的文件,文件內(nèi)容即為:com.acme.osgi.Factory,在程序中則這么編寫來加載此FrameworkFactory實現(xiàn)類:

    ServiceLoader<FrameworkFactory> sl=ServiceLoader.load(FrameworkFactory.class);

    Iterator<FrameworkFactory> it=sl.iterator();

    在創(chuàng)建了FrameworkFactory實現(xiàn)的實例后,就可調(diào)用newFramework方法了,newFramework方法中的Map參數(shù)為控制OSGi框架行為的一些配置項,關(guān)鍵的有:

    n  org.osgi.framework.bootdelegation

    配置哪些package需要從boot classloader中加載,配置的值可為com.acme.*com.acme.services。

    n  org.osgi.framework.executionenvironment

    配置Framework執(zhí)行所需的環(huán)境,例如J2SE-1.5。

    n  org.osgi.framework.library.extensions

    native code的擴(kuò)展名配置,例如so,dll

    n  org.osgi.framework.startlevel

    配置Bundle啟動級別。

    n  org.osgi.framework.storage

    配置用于存儲OSGi應(yīng)用運(yùn)行時的Bundle狀態(tài)等信息的路徑,當(dāng)此路徑不存在時,框架應(yīng)負(fù)責(zé)進(jìn)行創(chuàng)建,如創(chuàng)建失敗則拋出異常。

    n  org.osgi.framework.storage.clean

    配置storage目錄是否要清除,例如值配置為onFirstInit,意味著當(dāng)Framework Bundle第一次初始化之前,storage目錄將被清空,這個配置項的好處是可以控制Framework重啟后是否需要根據(jù)上次運(yùn)行時的狀態(tài)來啟動。

    n  org.osgi.framework.system.packages

    Frameworkparent ClassLoader應(yīng)對外exportpackages

    n  org.osgi.framework.system.packages.extra

    在上面的配置項的基礎(chǔ)上增加了擴(kuò)展屬性的配置,例如:

    org.osgi.framework.system.packages.extra=org.acme.foo;version=1.2

    n  org.osgi.framework.bundle.parent

    equinox中的osgi.parentClassLoader屬性的含義一樣,用于控制boot classloader具體是哪個classloader,有四個可選的屬性值:bootapp、ext、framework,含義和equinox完全相同。

    根據(jù)需要給這些屬性配置相應(yīng)的值后,即可調(diào)用newFramework方法創(chuàng)建出Framework對象了。

    n  調(diào)用Frameworkinit方法

    init方法中完成Bundle Context的創(chuàng)建以及Framework services的注入。

    n  通過Framework獲取BundleContext

    n  安裝Bundle

    通過BundleContext.installBundle來安裝需要的Bundle。

    n  調(diào)用Frameworkstart方法

    FrameworkStartLevel service設(shè)置為指定的啟動級別,從而促發(fā)已安裝的所有的Bundleresolve和啟動。

    n  調(diào)用FrameworkwaitForStop方法

    調(diào)用此方法,等待Framework的停止運(yùn)行。

    按照以上說明,一個典型的基于OSGi R4.2規(guī)范的OSGi Framework的啟動過程代碼編寫示例如下:

    Map p=new HashMap();

    p.put(“org.osgi.framework.storage”,System.getProperties(“user.home”)+File.separator+”osgi”);

    FrameworkFactory factory=Class.forName(factoryClassName).newInstance();

    Framework framework=factory.newFramework(p);

    framework.init();

    BundleContext context=framework.getBundleContext();

    …//安裝Bundles

    framework.start();

    framework.waitForStop();

    對比Felix的啟動代碼,是不是覺得有點相似呢?

    OSGi規(guī)范中對Framework的生命周期也做了詳細(xì)的說明,圖示如下:


    具體來看看init、start以及stop Framework時會做哪些事情。

    n  init

    init后,需要做到以下效果:

    啟動事件分發(fā)處理功能;

    配置好Security Manager;

    StartLevel設(shè)置為指定的startlevel,默認(rèn)為0;

    創(chuàng)建可用的BundleContext對象;

    所有安裝的Bundles的狀態(tài)均設(shè)置為INSTALLED;

    Framework提供的services都可用;

    Framework的狀態(tài)為STARTING。

    n  start

    負(fù)責(zé)根據(jù)StartLevel啟動相應(yīng)的已安裝的Bundle,如Bundle啟動失敗,則廣播Framework.ERROR的事件,啟動完畢后Framework的狀態(tài)為ACTIVE

    n  stop

    負(fù)責(zé)停止所有運(yùn)行的Bundle,釋放所有的資源,并將Framework的狀態(tài)置為RESOLVED。

    n  update

    停止Framework,并給Framework.waitForStop方法返回STOPPED_UPDATESTOPPED_BOOTCLASSPATH_MODIFIED事件值,然后應(yīng)用代碼應(yīng)自行完成update處理。

    Framework規(guī)范中,OSGi還說明了Framework運(yùn)行于多線程模式下,即所有Bundle都運(yùn)行在各自的線程中,基于事件機(jī)制來響應(yīng)其他Bundle的事件。

             從以上改動來看,增加的Framework章節(jié)是最大的改動,Framework規(guī)范的制定吸取了Felix以及Equinox的優(yōu)點,對于統(tǒng)一OSGi Framework的啟動方式以及行為將起到很大的作用,尤其是對于嵌入OSGi框架的應(yīng)用以及需要與其他容器集成的OSGi應(yīng)用而言會有很大的幫助。

    posted on 2009-05-31 17:32 BlueDavy 閱讀(5295) 評論(0)  編輯  收藏 所屬分類: OSGi、SOA、SCA

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導(dǎo)航

    <2009年5月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統(tǒng)計

    隨筆分類

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字幕无码一区二区免费| 99视频免费播放| 最近免费mv在线电影| 成人毛片18岁女人毛片免费看| 亚洲阿v天堂在线2017免费| 亚洲国产精品无码久久SM| 456亚洲人成在线播放网站| 人妖系列免费网站观看| 免费观看美女用震蛋喷水的视频| 国产99视频免费精品是看6| 亚洲欧洲日韩不卡| 粉色视频在线观看www免费| 1000部啪啪未满十八勿入免费| 四虎影视精品永久免费网站| 久久精品国产亚洲av水果派| 阿v免费在线观看| 国产成人免费在线| 色久悠悠婷婷综合在线亚洲| 亚洲人成日本在线观看| 国产在线精品一区免费香蕉| 成年人在线免费看视频| 亚洲激情中文字幕| 香蕉国产在线观看免费| 18禁成年无码免费网站无遮挡| 一个人免费观看www视频| 丁香花免费完整高清观看| 亚洲人成网77777亚洲色| 亚洲精品亚洲人成在线| 桃子视频在线观看高清免费视频 | 四虎永久成人免费影院域名| 97久久精品亚洲中文字幕无码| 一本久久A久久免费精品不卡| 无码免费午夜福利片在线| 亚洲av无码一区二区三区网站| 羞羞视频免费网站含羞草| 一个人免费观看在线视频www| 久久久久亚洲Av片无码v| 搜日本一区二区三区免费高清视频| 国产卡二卡三卡四卡免费网址| 亚洲成熟xxxxx电影| 黄色视屏在线免费播放|