7.6. 服务(Service)
Service有两种,component上的service,composite上的service(最上层composite的service也可称为application的service)。属性上只有一个差别,就是composite的service有一个属性promote,他是表示这个属性是由哪个component的哪个service提升来的。查看Restaurant2.composite中composite service的定义
<sca:service name="RestaurantService" promote="RestaurantServiceComponent/RestaurantService"/>
通过promote,我们知道这个service是RestaurantServiceComponent的RestaurantService提升来的,实际是由RestaurantServiceComponent提供服务的实现。
Eclipse SCA tools 上composite service的属性
图7_6_1
Promote2提供一个下拉列表来选择service。
Service上要添加interface,这个前面介绍过了。Service上还要添加binding,这个后面节说明。
Policy sets和requires也是后面介绍。
7.7. 引用(Reference)
Reference同样有component上的reference,和composite上的reference。属性上差别在于component上的reference有autowire,composite上的没有。Composite的reference有promote。
7.7.1. Component reference
打开Restaurant2.composite,可以看到reference的定义。
<sca:component name="RestaurantServiceComponent">
<sca:implementation.java class="restaurant2.lib.RestaurantServiceImpl"/>
<sca:reference name="menuService"/>
<sca:reference name="billService"/>
<sca:service name="RestaurantService">
<sca:interface.wsdl interface="http://api.restaurant2/#wsdl.interface(RestaurantService)"/>
<sca:binding.ws uri="http://localhost:8085/RestaurantService"/>
</sca:service>
</sca:component>
这里定义的很简单,我们在diagram上看一下他的属性。
图7_7_1
Name:必填
Autowire:自动连接,这个在后面说明
Policy sets 和requires也在后面说明
Multiplicity,这个reference可以被wire的次数。0..1就是可以被wire0到1次。这个是下拉列表,还可以选1..1, 0..n, 1..n
Target,一个或多个service的URI,依赖于multiplicty的值
Target2 是用来选择service的,不是reference的属性
WireByImpl,。默认值是false,在实现里动态地连线wire该reference到service。如果设为“true”,表示这个reference wire的service由实现代码在“运行时(runtime)”里设置(比如,通过某种方式由代码获得一个endpoint reference,然后使用程序接口来设置它为当前reference的target)。如果值为”true”,那么reference不用被wire。
Tuscany1.x没有对WireByImpl这个属性提供支持。
7.7.2. Composite reference
它一个属性就是promote,表示这个composite reference是由哪个component reference提升来的。Promote可能包含多个值,因为多个component reference可以提升到同一个composite reference。这个必须满足以下三个条件:
(1) component的reference的interface是相同,或者,如果composite的reference声明了一个interface,那么所有的component的reference必须与该interface兼容•
(2) component的reference的multiplicity兼容
(3) component的reference上声明的intents必须兼容 – 这种情况下,应用于composite reference上的intents是所有被promote的component的reference上intents的合集。如果有任何intents冲突,则不可以。
如果指定了interface,那么该interface必须与被promote的component reference的interface 相同,或者前者是后者的超集。
multiplicity属性的值必须与component reference的multiplicity的值相同或进行更进一步的限制。比如component reference的multiplicity 为1..n,那么composite reference的multiplicity可以为1..1, 或者1..n, 不能是0..n。