2、 擴展Binding
SCA規范中對Binding的定義有兩種,一種為Service Binding,一種為Reference Binding。Service Binding定義了外部客戶用來訪問Service的入口,Reference Binding描述了引用外部服務的方式,換句簡單的話說就是,Reference Binding為引進(與貿易名詞‘進口’對應),Service Binding為導出(與貿易名詞‘出口’對應)。
目前已實現的binding方式有:rmi,ejb,jms,sca,webservice,其中有些binding實現還不支持service binding,僅支持reference binding。
Binding的裝配時運行圖如下:
下面詳細說明一下在Tuscany中實現一種擴展Binding的方式。
a. 定義Reference,Service Binding上的擴展模型
b. 定義模型Binding的接口及實現,在其中可以定義用戶自己的一些屬性,接口必須要實現org.apache.tuscany.sca.assembly.Binding,此接口中定義了Binding中的一些基本屬性如URI等。
c. 定義binding的解析器,實現接口StAXArtifactProcessor,其中包含了read,write,resolve方法,分別負責讀自定義的節點,Binding實例保存,擴展解析生成的Binding對象。
d. 定義Binding提供者的工工廠類,實現接口BindingProviderFactory,在其中要實現ReferenceBindingProvider,ServiceBindingProvider的創建,分別負責Reference Binding,Service Binding的具體動作。
e. 實現ModuleActivator,在其start方法中注冊binding解析器和BindingProviderFactory
f. 在系統注冊Binding(在com.primeton.sca.runtime.IModelLoade文件中注冊ModuleActivator)
示例
擴展Binding示例,實現echo的功能,reference binding引用service binding提供的服務。
a. 在composite定義文件中binding的使用方式如下
- <composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
- targetNamespace="http://sample/echo"
- xmlns:se="http://sample/echo"
- xmlns:e="http://echo"
- name="EchoBinding">
-
- <service name="EchoService" promote="EchoComponent">
- <interface.java interface="echo.Echo"/>
- <e:binding.echo uri="http://tempuri.org" />
- </service>
-
- <component name="EchoComponent">
- <implementation.java class="echo.EchoComponentImpl"/>
- </component>
-
- <reference name="EchoReference" promote="EchoComponent/echoReference">
- <interface.java interface="echo.Echo"/>
- <e:binding.echo uri="http://tempuri.org" />
- </reference>
-
- </composite>
其schema如下:
- <element name=“binding.echo" type="sca:EchoBinding" substitutionGroup="sca:binding" />
- <complexType name=“EchoBinding">
- <complexContent>
- <extension base="sca:Binding“/>
- </complexContent>
- </complexType>
b.定義EchoBinding接口,擴展了org.apache.tuscany.sca.assembly.Binding
- /**
- *AmodelforthesampleEchobinding.
- */
- publicinterface EchoBinding extends Binding {
- }
- c.定義EchoBindingFactory接口,通過此工廠可以生成EchoBinding實例
- publicinterface EchoBindingFactory {
-
- /**
- *CreatesanewEchobinding.
- *
- *@returnanewEchobinding
- */
- EchoBinding createEchoBinding();
- }
c.定義EchoBinding 的實現EchoBindingImpl
- /**
- *ImplementationoftheEchobindingmodel.
- */
- publicclass EchoBindingImpl implements EchoBinding {
-
- private String name;
- private String uri;
-
- public String getName() {
- returnname;
- }
-
- public String getURI() {
- returnuri;
- }
-
- publicvoid setName(String name) {
- this.name = name;
- }
-
- publicvoid setURI(String uri) {
- this.uri = uri;
- }
-
- public List<PolicySet> getPolicySets() {
- // The sample binding does not support policies
- return Collections.emptyList();
- }
-
- public List<Intent> getRequiredIntents() {
- // The sample binding does not support policies
- return Collections.emptyList();
- }
-
- public List<Object> getExtensions() {
- // The sample binding does not support extensions
- return Collections.emptyList();
- }
-
- publicboolean isUnresolved() {
- // The sample binding is always resolved
- returnfalse;
- }
-
- publicvoid setUnresolved(boolean unresolved) {
- // The sample binding is always resolved
- }
-
- }
d.定義EchoBindingFactory 的實現DefaultEchoBindingFactory
- publicclass DefaultEchoBindingFactory implements EchoBindingFactory {
-
- public EchoBinding createEchoBinding() {
- returnnew EchoBindingImpl();
- }
-
- }
e.定義節點的解析器EchoBindingProcessor,負責解析binding.echo,并生成對象EchoBinding實例,采用XMLStreamReader進行解析。
f.定義binding的具體動作,在接口ReferenceBindingProvider和ServiceBindingProvider實現。
ServiceBindingProvider在其start方法中進行對外服務的提供,提供監聽外部的調用。Stop方法中銷毀對外的監聽。
ReferenceBindingProvider在其createInvoker方法中實現引用外部服務的具體實現.在本例中只是把輸入的值直接返回。
g. 實現ModuleActivator,對解析器及調用ProviderFactory進行注冊。并在org.apache.tuscany.sca.core.ModuleActivator文件中對ModuleActivator進行注冊到系統運行環境中。
(未完待續)