關(guān) 注 開 源 (王鋒的Blog)

          Spring Hibernate Jboss Tomcat SCA OSGI

          Tuscany SCA擴展機制研究(續(xù))

          2、 擴展Binding

          SCA規(guī)范中對Binding的定義有兩種,一種為Service Binding,一種為Reference Binding。Service Binding定義了外部客戶用來訪問Service的入口,Reference Binding描述了引用外部服務(wù)的方式,換句簡單的話說就是,Reference Binding為引進(與貿(mào)易名詞‘進口’對應(yīng)),Service Binding為導出(與貿(mào)易名詞‘出口’對應(yīng))。

          目前已實現(xiàn)的binding方式有:rmi,ejb,jms,sca,webservice,其中有些binding實現(xiàn)還不支持service binding,僅支持reference binding。

          Binding的裝配時運行圖如下:

          下面詳細說明一下在Tuscany中實現(xiàn)一種擴展Binding的方式。

          a. 定義Reference,Service Binding上的擴展模型

          b. 定義模型Binding的接口及實現(xiàn),在其中可以定義用戶自己的一些屬性,接口必須要實現(xiàn)org.apache.tuscany.sca.assembly.Binding,此接口中定義了Binding中的一些基本屬性如URI等。

          c. 定義binding的解析器,實現(xiàn)接口StAXArtifactProcessor,其中包含了read,write,resolve方法,分別負責讀自定義的節(jié)點,Binding實例保存,擴展解析生成的Binding對象。

          d. 定義Binding提供者的工工廠類,實現(xiàn)接口BindingProviderFactory,在其中要實現(xiàn)ReferenceBindingProvider,ServiceBindingProvider的創(chuàng)建,分別負責Reference Binding,Service Binding的具體動作。

          e. 實現(xiàn)ModuleActivator,在其start方法中注冊binding解析器和BindingProviderFactory

          f. 在系統(tǒng)注冊Binding(在com.primeton.sca.runtime.IModelLoade文件中注冊ModuleActivator)

          示例

          擴展Binding示例,實現(xiàn)echo的功能,reference binding引用service binding提供的服務(wù)。

          a. 在composite定義文件中binding的使用方式如下

          1. <composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
          2.       targetNamespace="http://sample/echo"
          3.       xmlns:se="http://sample/echo"
          4.       xmlns:e="http://echo"
          5.       name="EchoBinding">
          6. <service name="EchoService" promote="EchoComponent">
          7. <interface.java interface="echo.Echo"/>
          8. <e:binding.echo uri="http://tempuri.org" />
          9. </service>
          10. <component name="EchoComponent">
          11. <implementation.java class="echo.EchoComponentImpl"/>
          12. </component>
          13. <reference name="EchoReference" promote="EchoComponent/echoReference">
          14. <interface.java interface="echo.Echo"/>
          15. <e:binding.echo uri="http://tempuri.org" />
          16. </reference>
          17. </composite>

          其schema如下:

          1. <element name=“binding.echo" type="sca:EchoBinding" substitutionGroup="sca:binding" />
          2. <complexType name=“EchoBinding">
          3. <complexContent>
          4. <extension base="sca:Binding“/>
          5. </complexContent>
          6. </complexType>

          b.定義EchoBinding接口,擴展了org.apache.tuscany.sca.assembly.Binding

          1. /**
          2. *AmodelforthesampleEchobinding.
          3. */
          4. publicinterface EchoBinding extends Binding {
          5. }
          6. c.定義EchoBindingFactory接口,通過此工廠可以生成EchoBinding實例
          7. publicinterface EchoBindingFactory {
          8. /**
          9. *CreatesanewEchobinding.
          10. *
          11. *@returnanewEchobinding
          12. */
          13. EchoBinding createEchoBinding();
          14. }

          c.定義EchoBinding 的實現(xiàn)EchoBindingImpl

          1. /**
          2. *ImplementationoftheEchobindingmodel.
          3. */
          4. publicclass EchoBindingImpl implements EchoBinding {
          5. private String name;
          6. private String uri;
          7. public String getName() {
          8. returnname;
          9. }
          10. public String getURI() {
          11. returnuri;
          12. }
          13. publicvoid setName(String name) {
          14. this.name = name;
          15. }
          16. publicvoid setURI(String uri) {
          17. this.uri = uri;
          18. }
          19. public List<PolicySet> getPolicySets() {
          20. // The sample binding does not support policies
          21. return Collections.emptyList();
          22. }
          23. public List<Intent> getRequiredIntents() {
          24. // The sample binding does not support policies
          25. return Collections.emptyList();
          26. }
          27. public List<Object> getExtensions() {
          28. // The sample binding does not support extensions
          29. return Collections.emptyList();
          30. }
          31. publicboolean isUnresolved() {
          32. // The sample binding is always resolved
          33. returnfalse;
          34. }
          35. publicvoid setUnresolved(boolean unresolved) {
          36. // The sample binding is always resolved
          37. }
          38. }

          d.定義EchoBindingFactory 的實現(xiàn)DefaultEchoBindingFactory

          1. publicclass DefaultEchoBindingFactory implements EchoBindingFactory {
          2. public EchoBinding createEchoBinding() {
          3. returnnew EchoBindingImpl();
          4. }
          5. }

          e.定義節(jié)點的解析器EchoBindingProcessor,負責解析binding.echo,并生成對象EchoBinding實例,采用XMLStreamReader進行解析。

          f.定義binding的具體動作,在接口ReferenceBindingProvider和ServiceBindingProvider實現(xiàn)。

            ServiceBindingProvider在其start方法中進行對外服務(wù)的提供,提供監(jiān)聽外部的調(diào)用。Stop方法中銷毀對外的監(jiān)聽。

            ReferenceBindingProvider在其createInvoker方法中實現(xiàn)引用外部服務(wù)的具體實現(xiàn).在本例中只是把輸入的值直接返回。

          g. 實現(xiàn)ModuleActivator,對解析器及調(diào)用ProviderFactory進行注冊。并在org.apache.tuscany.sca.core.ModuleActivator文件中對ModuleActivator進行注冊到系統(tǒng)運行環(huán)境中。

          (未完待續(xù))

          posted on 2007-08-05 11:08 wangfeng 閱讀(494) 評論(0)  編輯  收藏


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 乡城县| 上虞市| 望谟县| 大城县| 手游| 雷州市| 鄂托克前旗| 澳门| 邳州市| 常宁市| 喀喇| 九龙城区| 丽水市| 绥棱县| 长宁区| 大连市| 焉耆| 新泰市| 福安市| 河津市| 南涧| 叙永县| 东港市| 黔东| 罗江县| 三门县| 礼泉县| 郑州市| 措美县| 陈巴尔虎旗| 和龙市| 桃园市| 年辖:市辖区| 嘉黎县| 白沙| 云和县| 商河县| 长寿区| 榆中县| 沙湾县| 南开区|