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

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

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

    隨筆-1  評論-9  文章-7  trackbacks-0

            在讀本文之前,您應(yīng)該對基于Equinox的開發(fā)有一定的了解,如果您還不太清楚,請參考基于Equinox開發(fā)HelloWorld一文。
            
            本文講到的例子是仿照網(wǎng)上甚為流行的一個例子,但苦于一直未找到源碼,網(wǎng)上貼的都是一些轉(zhuǎn)帖,代碼片段,估計(jì)初學(xué)者很難將其還原并調(diào)通!我最開始弄這個咚咚的時候,其過程之痛苦,難以言喻,所以想著仿照該例子的設(shè)計(jì),給予實(shí)現(xiàn),文后貼出源碼,希望能幫到大家。
            該例子是一個關(guān)于計(jì)算器的實(shí)例,osgi.example.compute bundle(下文簡稱compute bundle)提供了統(tǒng)一的計(jì)算接口:Compute,另外兩個bundle分別為osgi.example.compute.add(下文簡稱add bundle)和osgi.example.compute.multiply(下文簡稱multiply bundle),在這兩個bundle中,各自對compute bundle進(jìn)行不同的實(shí)現(xiàn),一個實(shí)現(xiàn)加法,一個實(shí)現(xiàn)乘法。另外還有一個服務(wù)消費(fèi)者osgi.example.compute.consumer bundle(下文簡稱consumer bundle),consumer bundle負(fù)責(zé)消費(fèi)add bundle和multiply bundle提供的服務(wù)。上述4個bundle之間的關(guān)系如下圖所示:

            創(chuàng)建4個bundle之后的工程目錄如下圖所示:


          通過該示例,將演示如何利用Spring DM發(fā)布和調(diào)用OSGi服務(wù),同時還將演示OSGi的動態(tài)服務(wù)調(diào)用能力。

    1.   bundle osgi.example.compute 
          compute bundle只提供一個接口——Compute,因此無需依賴更多的bundle,只需最基本的osgi即可。因?yàn)椴簧婕白再Y源之類的,所以也無需Activator入口類。
    Computer接口源代碼如下所示:

    package osgi.example.compute;   
      
    public interface Compute {   
        
    public String computeNums(int x, int y);   
    }
      

    2.    bundle osgi.example.compute.add

            add bundle是對compute bundle的具體服務(wù)實(shí)現(xiàn),在MANIFEST.MF文件需要引入osgi.example.compute包;當(dāng)然也可以通過添加依賴bundle的形式,即不引入包,而直接在Required Plug-ins中添加compute bundle。如下圖所示:


    注意:OSGi官方指出,當(dāng)需要用到其他bundle的類型時,不提倡依賴bundle,應(yīng)該盡可能采用Import-package的方式引入包,因?yàn)橐蕾?span style="color: #ff0000">bundle可能在加載bundle的時候發(fā)生問題。


    add bundle的工程結(jié)構(gòu)如下圖所示:

     

           通過引入osgi.example.compute包,osgi.example.compute  bundle被加到了add bundl的classpath當(dāng)中,解決了開發(fā)時期的類型識別問題。
    這樣一來,在add bundle中就能使用compute bundle中的接口了,Computer接口的實(shí)現(xiàn)如下:

    package osgi.example.compute.add;   
      
    import osgi.example.compute.Compute;   
      
    public class Add implements Compute {   
      
        
    public String computeNums(int x, int y) {   
            
    int s = x + y;   
            String result 
    = "The Sum is---" + String.valueOf(s);   
            
    return result;   
        }
       
    }
      

            Compute的實(shí)現(xiàn)已經(jīng)實(shí)現(xiàn)了,那么如何將其發(fā)布出去呢?這個是由Spring DM負(fù)責(zé),Spring DM利用OSGi命名空間下的<service>元素將bean導(dǎo)出為OSGi服務(wù)。最簡單的形式為:

    <beans:bean id="beanToPublish" class="com.xyz.imp.MessageServiceImp"/>   
    <service ref="beanToPublish" interface="com.xyz.MessageService"/> 

            從示例中可以看出,beanToPublish被service元素聲明導(dǎo)出。
    另外,service結(jié)點(diǎn)還有一些高級屬性,如depends-on、context-class-loader、ranking等待,詳情請看spring dm reference。
            首先,需要在add bundle的工程根目錄下的”META-INF”的文件夾下創(chuàng)建一個文件夾,取名”spring”,Spring DM能夠自動解析該文件夾下所有的spring配置文件。spring配置文件的具體內(nèi)容如下所示:

    <?xml version="1.0" encoding="UTF-8"?>   
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"    
        xmlns:osgi
    ="http://www.springframework.org/schema/osgi"  
        xsi:schemaLocation
    ="http://www.springframework.org/schema/beans                         http://www.springframework.org/schema/beans/spring-beans.xsd   
                            http://www.springframework.org/schema/osgi                          http://www.springframework.org/schema/osgi/spring-osgi.xsd">   
        <bean id="addOsgiService" class="osgi.example.compute.add.Add">   
        
    </bean>   
        
    <osgi:service id="addService" ref="addOsgiService"  
            
    interface="osgi.example.compute.Compute">   
        
    </osgi:service>   
    </beans>  
            如此一來,其他bundle就能通過spring dm引入接口類型為osgi.example.compute.Compute的服務(wù)了,spring dm將通過一定的服務(wù)查找策略,返回匹配的服務(wù)。

    3.    bundle osgi.example.compute.multiply

    該bundle和add bundle相似,在這就不贅述了。
    4.    bundle osgi.example.compute.client

            顧名思義,該bundle將作為add 、multiply兩個bundle的客戶bundle,演示如何導(dǎo)入服務(wù)。
            OSGi的測試工作比較麻煩,這方面還沒研究,在這里利用spring實(shí)例化bean的時期,從構(gòu)造函數(shù)入手,對服務(wù)進(jìn)行測試。Client類的實(shí)現(xiàn)很簡單,如下所示:

    package osgi.example.client;   
      
    import osgi.example.compute.Compute;   
      
    public class Client {   
        
    /**  
         * 為了方便測試,采用Spring的構(gòu)造注入方式,直接在構(gòu)造函數(shù)中調(diào)用Compute服務(wù)  
         * 
    @param compute  
         
    */
      
        
    public Client(Compute compute){   
            System.out.println(compute.computeNums(
    56));   
        }
       
    }
      

          另外,因?yàn)閏lient用到了其他幾個bundle的類型,所以需要導(dǎo)入相應(yīng)的包,步驟在上面已有講到。
          spring dm靠<reference>元素來引入服務(wù),最簡單的形式如下所示:

    <reference id="beanToPublish" interface="com.xyz.MessageService"/>  

          如果需要用到該服務(wù),如某個bean包含一個com.xyz.MessageService屬性,則配置該bean如下所示:

    <bean id="referenceBean" class="com.nci.ReferenceBean">   
        
    <property name="messageService" ref="beanToPublish"/>   
    </bean>  
          reference元素還有一些高級屬性,詳情請見spring dm reference。
         看一下client的spring配置文件:
    <?xml version="1.0" encoding="UTF-8"?>   
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"  
        xsi:schemaLocation
    ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   
                          http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">   
      
        
    <bean id="OSGiClient" class="osgi.example.client.Client">   
            
    <constructor-arg ref="ComputeService">   
            
    </constructor-arg>   
                    
    </bean>   
                    
    <osgi:reference id="ComputeService" interface="osgi.example.compute.Compute" cardinality="1..1">   
                    
    </osgi:reference>   
    </beans>   
           從上面的示例,我們可以發(fā)現(xiàn),服務(wù)的導(dǎo)出的時候都是基于接口的,服務(wù)的引用也是基于接口的,不過spring dm支持基于類的導(dǎo)出、導(dǎo)入,但是還是建議盡量基于接口,應(yīng)該記住面向接口編程的思想,以應(yīng)對將來有可能發(fā)生的改變。

    5.    運(yùn)行
          由于add和multiply都是基于Compute接口對外導(dǎo)出服務(wù),那么Client到底導(dǎo)入的是哪個服務(wù)呢?默認(rèn)情況下,會導(dǎo)入啟動較早的bundle服務(wù)(OSGi在bundle啟動時,會為其分配一個ID值,啟動越早,該值越小)。
          運(yùn)行之前,我們需要做這么一件事,在window->preferences->plug-in development->Target Platform面板中,將Target指定為Spring DM…,如下圖所示:

            之后就可以配置運(yùn)行了,隨便在一個bundle工程上右鍵,Run As->Run Configurations,新建一個OSGi Platform運(yùn)行項(xiàng)(右鍵OSGi Platform即可),如下圖所示:

           需要勾選中spring bundle版(2.5.6),spring dm的幾個核心包:core、extender、io再點(diǎn)validate bundles按鈕,校驗(yàn)是否已全部選中其依賴的bundle。然后即可點(diǎn)擊運(yùn)行了。
           運(yùn)行之后,我們發(fā)現(xiàn)控制臺輸出結(jié)果:
    The Sum is---11
    通過ss命令,如下:
    5 ACTIVE      osgi.example.compute.multiply_1.0.0
    6 ACTIVE      osgi.example.compute.add_1.0.0
    7 ACTIVE      osgi.example.compute.client_1.0.0
    將6停掉:stop 6
    然后再refresh 7,控制臺輸出如下結(jié)果:
    The Multiply is---30
    通過 ss 命令,如下:
    5 ACTIVE      osgi.example.compute.multiply_1.0.0
    6 RESOLVED    osgi.example.compute.add_1.0.0
    7 ACTIVE      osgi.example.compute.client_1.0.0
    現(xiàn)在multiply處于運(yùn)行狀態(tài),而add已經(jīng)被停止,所以client導(dǎo)入的服務(wù)實(shí)際是由multiply提供的。

    6. 總結(jié) 

           通過該文檔,我們已經(jīng)清楚了,如何使用Spring DM導(dǎo)出、導(dǎo)入服務(wù)。Spring DM的一些高級特性請查閱spring dm reference。


    附件:osgi.example.compute.rar

    posted on 2010-03-28 17:36 Dreava 閱讀(12094) 評論(9)  編輯  收藏 所屬分類: OSGi

    評論:
    # re: Spring DM的開發(fā)示例 2011-02-21 10:50 | sgwood
    有些受啟發(fā),謝謝!  回復(fù)  更多評論
      
    # re: Spring DM的開發(fā)示例[未登錄] 2011-05-10 13:26 | peter
    期待有web開發(fā)的例子
    QQ:404089478  回復(fù)  更多評論
      
    # re: Spring DM的開發(fā)示例 2011-06-29 11:49 | 小鄭
    剛接觸,我怎樣用DM開發(fā)一個WEB項(xiàng)目呢?QQ:99134194  回復(fù)  更多評論
      
    # re: Spring DM的開發(fā)示例 2011-12-14 15:51 | qchen
    感謝分享  回復(fù)  更多評論
      
    # re: Spring DM的開發(fā)示例 2012-10-29 17:33 | 南云
    spring的bean聲明配置文件和osgi發(fā)布文件應(yīng)該分別放在兩個文件中。。


    分別是 模塊-spring.xml 和 模塊-spring-osgi.xml  回復(fù)  更多評論
      
    # re: Spring DM的開發(fā)示例 2012-11-23 11:05 | laidianren
    很不錯,辛苦了。  回復(fù)  更多評論
      
    # re: Spring DM的開發(fā)示例[未登錄] 2013-01-23 22:11 | fly
    不錯啊 很好,跑成功了。  回復(fù)  更多評論
      
    # re: Spring DM的開發(fā)示例[未登錄] 2013-10-06 13:58 | xxx
    中間配置<service>還是不懂。沒看會。  回復(fù)  更多評論
      
    # re: Spring DM的開發(fā)示例 2013-10-14 14:49 | Jaken.Cooper
    運(yùn)行前:
    在window->preferences->plug-in development->Target Platform面板中
    設(shè)置的根本不是那張圖顯示的,沒有選擇Pre-defined Targets的地方,
    我的Target Platform里面只有 Running Platform(Active)這個列表
    所以在OSGI Framework里面也選不了spring的組件

    請問下,這種情況怎么解決啊?謝謝了

    PS:我的PDE版本是3.7的  回復(fù)  更多評論
      

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: va亚洲va日韩不卡在线观看| 久久久久亚洲AV成人网| 亚洲色www永久网站| 免费无码又爽又刺激高潮| 国产精品自拍亚洲| 亚洲人成网7777777国产| 在线精品一卡乱码免费| 亚洲av无码兔费综合| 国产亚洲色婷婷久久99精品91| 一级毛片全部免费播放| 亚洲人成网站999久久久综合| 亚洲黄片手机免费观看| 57pao一国产成永久免费| jizzjizz亚洲日本少妇| 亚洲AV无码乱码在线观看富二代 | 日韩精品视频免费网址| 中国在线观看免费的www| 亚洲中文字幕人成乱码| 亚洲精品偷拍视频免费观看 | 91福利免费视频| 精品国产亚洲第一区二区三区| 亚洲国产综合精品中文第一区| 在线a毛片免费视频观看| 日韩视频在线观看免费| 男男黄GAY片免费网站WWW| 久久青青草原亚洲av无码app| 亚洲国产精品毛片av不卡在线 | 免费网站看v片在线香蕉| 免费看搞黄视频网站| 国产精品亚洲专区一区| 亚洲国产成人精品久久| 在线观看亚洲天天一三视| 免费高清资源黄网站在线观看| 无码人妻精品中文字幕免费| 未满十八私人高清免费影院| 色婷五月综激情亚洲综合| 亚洲国产成人久久精品动漫| 亚洲伊人久久成综合人影院| 色视频色露露永久免费观看| 成人免费激情视频| 亚洲视频在线观看免费|