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

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

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

    Chasing an mobile web vision

    闖蕩在移動(dòng)互聯(lián)網(wǎng)的世界中

    OSGi介紹(三)OSGi service platform的體系結(jié)構(gòu)

    先讓我們來(lái)看看OSGi service platform的體系結(jié)構(gòu)。另外要說(shuō)明的是,我在后面的文章中,將采用framework來(lái)代替OSGi service platfrom,這樣比較簡(jiǎn)便。
    下面這張圖來(lái)自O(shè)SGi Alliance的主頁(yè)(http://www.osgi.org/
     
    OSGi Service Platform Architecture

    層次很分明吧。放到我們假想的案例中,OS&Hardware可以對(duì)應(yīng)為PDA的硬件和操作系統(tǒng),您可以想象它是Intel xscacle + Microsoft window mobile,或者是Arm + embedded Linux
    而Execution Environment當(dāng)然是我們上次提到的CVM + CDC + FP + PP,有這個(gè)jvm的配置運(yùn)行framework就綽綽有余了。而再往上,就是我們要重點(diǎn)學(xué)習(xí)和分析的OSGi framework了。而Modules, Life Cycle, Service Registry, Services和Security是從不同的5個(gè)角度來(lái)劃分framework所具備的功能,后面我將會(huì)從除了Security外的四個(gè)方面分別結(jié)合我們的假設(shè)場(chǎng)景來(lái)分析。而體系結(jié)構(gòu)的最上層是符合OSGi framework接口標(biāo)準(zhǔn)的應(yīng)用程序,也就是OSGi世界中有名的“bundle”。

    下面來(lái)看看OSGi規(guī)范是如何定義一個(gè)bundle的。在r4規(guī)范的第27頁(yè)中大致這樣描述到:Framework定義了模塊(modularization)的單元,叫作bundle。Bundle實(shí)際就是一個(gè)具有jar(Java ARchive)格式的文件,其中包含了java的class文件和其他資源文件(比如圖標(biāo),配置文件等等)。Bundle可以在自己的manifest文件中說(shuō)明自己能夠提供哪些java包,其他bundle如果在自己的manifest文件中指定了它需要這個(gè)包,那他們之間就可能產(chǎn)生java包的依賴關(guān)系,這樣多個(gè)bundle之間就可以共享java包。值得注意的是,bundle是能夠在framework中部署的唯一格式。下面給出原文的描述:
    A bundle is a JAR file that:
    ? Contains the resources necessary to provide some functionality. These resources may be class files for the Java programming language, as well as other data such as HTML files, help files, icons, and so on. A bundle JAR file can also embed additional JAR files that are available as resources and classes. This is however not recursive.
    ? Contains a manifest file describing the contents of the JAR file and providing information about the bundle. This file uses headers to specify information that the Framework needs to install correctly and activate a bundle. For example, it states dependencies on other resources, such as Java packages, that must be available to the bundle before it can run.
    ? Can contain optional documentation in the OSGI-OPT directory of the JAR file or one of its sub-directories. Any information in this directory is optional. For example, the OSGI-OPT directory is useful to store the source code of a bundle. Management systems may remove this information to save storage space in the OSGi Service Platform.

    framework的modules這一方面功能將主要負(fù)責(zé)bundle的安裝部署,更新和卸載,以及bundle在設(shè)備的物理存儲(chǔ)(如果有的話)。在這個(gè)層次,每個(gè)bundle都是獨(dú)立的,它的安裝,升級(jí)和卸載完全不依賴任何其他bundle,這點(diǎn)framework提供了強(qiáng)大的隔離性。Life Cycle專門負(fù)責(zé)對(duì)bundle的解析(比如關(guān)聯(lián)兩個(gè)有相互依賴關(guān)系的bundle),啟動(dòng)(相當(dāng)于運(yùn)行應(yīng)用程序)和停止(相當(dāng)于停止應(yīng)用程序)。這個(gè)層次中,bundle間的邏輯關(guān)系被創(chuàng)建起來(lái),這些關(guān)系能否成功的創(chuàng)建,將會(huì)直接影響bundle的成功解析和啟動(dòng)。Service Registry可以認(rèn)為是一個(gè)數(shù)據(jù)庫(kù),bundle啟動(dòng)后,可以向這個(gè)數(shù)據(jù)庫(kù)注冊(cè)它動(dòng)態(tài)提供的服務(wù)。只要bundle不被停止,且bundle不主動(dòng)撤銷注冊(cè)的服務(wù),這個(gè)服務(wù)將一直保存在這個(gè)數(shù)據(jù)庫(kù)中供其它bundle來(lái)查詢和使用。而Services就是由bundle運(yùn)行時(shí)提供的具體服務(wù)對(duì)象,這些服務(wù)對(duì)象的存在,使得framework具有極其動(dòng)態(tài)的特征,并為framework運(yùn)行時(shí)提供靈活強(qiáng)大的功能。
    另外,根據(jù)OSGi Alliance的說(shuō)法,OSGi的運(yùn)行平臺(tái)包括了j2me(kvm + cldc + midp, cvm + cdc+fp), j2se, j2ee。不過(guò),我個(gè)人還是覺(jué)得目前的midp規(guī)范還太弱,OSGi要想運(yùn)行在上面,很多功能實(shí)現(xiàn)起來(lái)都比較不爽。

    好,有了對(duì)framework結(jié)構(gòu)層次的皮毛認(rèn)識(shí),下面我們就開始著手改造那個(gè)“扶貧助手”的程序,使其變成OSGi的bundle(s),然后從上面提到的4個(gè)方面來(lái)分析framework的機(jī)制。
    這里,我先給出“扶貧助手”的java application模擬程序代碼:

    package aa.bb.cc;

    public class FamilyInfo {
     
    private String familyName; //家庭名稱
     private int population; //人口數(shù)量
     private int incomePerYear; //家庭年收入

      …..
    //省略了getter和setter方法

    //獲得家庭人均年收入
     public int getIncomePerMember(){
      
    return (int)(this.incomePerYear/this.population);
     }


     
    public String toString() {
      
      
    return "Family: " + this.familyName + ", population: " + this.population + ", income: " + this.incomePerYear;
     }

     
    //按家庭年收入又低到高排序
     public static void sortByIncomePerYear(FamilyInfo[] families){
      FamilyInfo temp 
    = null;
      
    for(int i = 0; i < families.length -1; i ++){
       
    for(int j = i + 1; j < families.length; j ++){
        
        
    if(families[i].getIncomePerYear() > families[j].getIncomePerYear()){
         temp 
    = families[i];
         families[i] 
    = families[j];
         families[j] 
    = temp;
        }

       }

      }

      
     }


     
    //按家庭人均年收入由低到高排序
     public static void sortByIncomePerMember(FamilyInfo[] families){
      FamilyInfo temp 
    = null;
      
    for(int i = 0; i < families.length -1; i ++){
       
    for(int j = i + 1; j < families.length; j ++){
        
        
    if(families[i].getIncomePerMember() > families[j].getIncomePerMember()){
         temp 
    = families[i];
         families[i] 
    = families[j];
         families[j] 
    = temp;
        }

       }

      }

      
     }


     
    public static void main(String[] args){
      FamilyInfo[] families 
    = new FamilyInfo[3];
      families[
    0= new FamilyInfo();
      families[
    0].setFamilyName("Zhang");
      families[
    0].setPopulation(3);
      families[
    0].setIncomePerYear(1200);
      families[
    1= new FamilyInfo();
      families[
    1].setFamilyName("Li");
      families[
    1].setPopulation(6);
      families[
    1].setIncomePerYear(1800);
      families[
    2= new FamilyInfo();
      families[
    2].setFamilyName("Liu");
      families[
    2].setPopulation(4);
      families[
    2].setIncomePerYear(1500);
      FamilyInfo.sortByIncomePerYear(families);
      
    for(int i = 0; i < families.length; i ++){
       System.out.println(families[i].toString());
      }

      FamilyInfo.sortByIncomePerMember(families);
      
    for(int i = 0; i < families.length; i ++){
       System.out.println(families[i].toString());
      }

      
     }

    }


     

    posted on 2006-02-14 15:42 勤勞的蜜蜂 閱讀(5177) 評(píng)論(3)  編輯  收藏

    評(píng)論

    # re: OSGi介紹(三)OSGi service platform的體系結(jié)構(gòu) 2007-06-21 17:25 hata

    這篇主要講了OSGI的體系結(jié)構(gòu),我覺(jué)得比較清晰,后面的POJO可能是后面用到的吧,收藏那張圖和那段講體系的話,HOHO!繼續(xù)!  回復(fù)  更多評(píng)論   

    # re: OSGi介紹(三)OSGi service platform的體系結(jié)構(gòu)[未登錄](méi) 2009-01-06 23:14 過(guò)客

    不錯(cuò),喝彩一把  回復(fù)  更多評(píng)論   

    # re: OSGi介紹(三)OSGi service platform的體系結(jié)構(gòu) 2009-04-29 14:21 guest

    對(duì)于OSGI體系結(jié)構(gòu),說(shuō)的不錯(cuò)
    請(qǐng)繼續(xù)啊  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产激情久久久久影院老熟女免费 | 一级毛片无遮挡免费全部| 久久精品a亚洲国产v高清不卡| 免费国产真实迷j在线观看| 亚洲国产精品免费在线观看| 福利免费在线观看| 美女被暴羞羞免费视频| 亚洲中文字幕无码av| 亚洲春色在线观看| 亚洲AV成人一区二区三区AV| 亚洲熟妇中文字幕五十中出| 亚洲AV网站在线观看| 免费毛片在线视频| 在线jyzzjyzz免费视频| 国产桃色在线成免费视频| 中文字幕天天躁日日躁狠狠躁免费| 久久久久久久国产免费看| 成人免费观看男女羞羞视频| 老司机午夜免费视频| 国产精品亚洲а∨无码播放麻豆| 亚洲人成欧美中文字幕| 亚洲一区二区三区成人网站 | 好吊妞788免费视频播放| 美女被cao免费看在线看网站| 57pao国产成视频免费播放| 久久久久免费看黄a级试看| 野花香高清视频在线观看免费 | 久久亚洲精品无码VA大香大香| 国产色爽免费无码视频| 免费看黄的成人APP| 最近中文字幕大全免费版在线 | 国产亚洲人成网站在线观看| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲乱码在线观看| 亚洲成年网站在线观看| 亚洲欧美不卡高清在线| 国产精品亚洲专区无码WEB| 边摸边脱吃奶边高潮视频免费| 免费一级做a爰片久久毛片潮| 亚洲五月午夜免费在线视频| 最近更新免费中文字幕大全|