关 注 开 源 (王锋的Blog)

Spring Hibernate Jboss Tomcat SCA OSGI

Tuscany SCA扩展机制研究(续)

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的使用方式如下

  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 的实现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 的实现DefaultEchoBindingFactory

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

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进行注册到系统运行环境中。

(未完待续)

posted on 2007-08-05 11:08 wangfeng 阅读(467) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: