|
对于模块组装者来说,有可能要指定模块的一些方面可能或必须由部署模块的子系统所覆盖(override)。能够被覆盖的方面是:
l 构件属性
l 入口点绑定
l 外部服务绑定
入口点绑定总是可覆盖的,因为必须它必须总是有可能为子系统在不同地址或绑定暴露一个入口点,而不仅是模块中所列出的。
模块组装者有一些关于是外部服务还是构件属性可能被覆盖的选项。每个元素都有具备下列值的覆盖属性:
l no – 值不可能被子系统覆盖。这是属性缺省值。
l may – 值可能被子系统覆盖。这是外部服务缺省值。
l must – 模块不指定值且子系统必须指定一个。
覆盖属性的完整细节在子系统覆盖部分描述。
在一个模块内的SCA外部服务(external service)代表使用此SCA模块的服务是远程服务。这些外部服务可被SCA构件提供的任何类似模块内的构件所访问。
外部服务使用绑定描述对外部服务的访问。更多详情参见绑定部分。
外部服务被声明为包含在sca.module文件中一个模块的子元素。外部服务被作为杠杆元素子节点的externalService元素所代表。在一个模块中可有零个或多个externalService元素。下列片段展示了externalService元素schema的模块schema。
<?xml version="1.0" encoding="ASCII"?>
<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" name="xs:NCName">
…
<externalService name="xs:NCName" override="sca:OverrideOptions">*
<interface.interface-type/>
<binding.binding-type uri="xs:anyURI"/>*
</externalService>
…
</module>
externalService 具备以下属性:
l name – 外部服务的名称。此名称:
o 必须在模块中跨越所有外部服务唯一,
o 外部服务不能够与同一模块中的构件有相同的名称,因为它们都能够作为连线的目标
l override – 外部服务是否可能被覆盖。有如下值:
o no – 特定的绑定及入口点地址必须保持不变。在这种情形,外部服务不作为在子系统级别的模块构件上的引用出现
o may – 绑定指定的服务可能被子系统所覆盖。此为缺省。
o must – 子系统必须绑定此外部引用。如果此选项被使用,应当没有提供绑定元素。
externalService有一个服务,依次有1个接口。此接口由interface元素描述,是externalService元素的子元素。接口可使用被WSDL或Java接口或其他接口定义语言指定 – 有关interface元素的更多详情参见接口部分。
外部服务接口必须是远程的。客户端与外部服务间的数据交换语义总是这样,以至于远程服务在一个调用期间或之后可能修改输入消息(参数)并在调用之后可能修改返回消息(结果),且输入消息的不修改或对返回消息的调用后修改对客户端可见。
externalService元素有零个或多个binding元素作为其子节点。binding元素详情在绑定部分描述。
外部服务的入口点地址,作为子binding元素部分被指定,可能在设计时指定或在部署时指定。另外,依据override属性的值,在设计时指定的入口点地址可能被设计时覆盖,这在覆盖部分解释。
外部服务成为模块构件的一个引用。依赖override属性的值,它可能在子系统级别与其他模块构件的一个服务或在子系统级别的一个外部服务连线。
外部服务是引用连线的有效目标。外部服务的名称是在此外部服务引用目标上设置的值。
1.3.7.1 外部服务示例
下图展示了在模块图中用于表达外部服务的外部服务符号。

图6:外部服务符号
下图展示了包含外部服务CustomerService及外部服务StockQuoteService的MyValueModule模块图。

图7:MyValueModule展示外部服务
以下片段展示了包含CustomerService与StockQuoteService外部服务元素MyValueModule文件的sca.module文件。外部服务CustomerService使用SCA远程绑定进行绑定。外部服务StockQuoteService使用Web服务进行绑定。绑定的入口点地址可被指定,例如使用绑定uri属性(详情参见绑定部分),可在SCA子系统配置中被覆盖。尽管在这种情况下外部服务StockQuoteService被绑定到Web服务,其接口被Java接口定义,其被创建自web服务的WSDL portType。
<?xml version="1.0" encoding="ASCII"?>
<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" name="MyValueModule">
…
<externalService name="CustomerService">
<interface.java interface="services.customer.CustomerService"/>
<binding.sca/>
</externalService>
<externalService name="StockQuoteService">
<interface.java interface="services.stockquote.StockQuoteService"/>
<binding.ws port="http://www.stockquote.org/StockQuoteService#.endpoint(StockQuoteService/StockQuoteServiceSOAP)"/>
</externalService>
…
</module>
入口点(entry point)被用于发布由模块提供的服务,以便它们被在一个模块的边界之外可寻址。发布自模块的服务可被在模块中被一个构件的服务定义,或在模块中的一个外部服务定义。后一种情形允许再发布一个具备新地址及/或新绑定的外部服务。
一个入口点发布由SCA模块利用特定绑定所提供的服务。有关绑定的更多详情参见绑定部分。
入口点在sca.module文件中被作为模块的子元素定义。入口点由entryPoint元素代表,是module元素的子节点。在一个模块中可有零个或多个entryPoint元素。以下片段展示了具备entryPoint子元素schema的模块schema。
<?xml version="1.0" encoding="ASCII"?>
<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" name="xs:NCName">
<entryPoint name="xs:NCName" multiplicity="0..1 or 1..1 or 0..n or 1..n">*
<interface.interface-type/>
<binding.binding-type uri="xs:anyURI"/>+
<reference>wire-target-URI</reference>
</entryPoint>
…
</module>
entryPoint元素有如下属性:
l name – 入口点的名称,名称必须在模块中跨越所有entryPoint唯一,在同一模块中没有entryPoint与构件有相同的名称,因为它们都能够是连线的源
l multiplicity(可选)- multiplicity可有以下值
o 1..1(缺省)– 一个连线可将此入口点作为一个源
o 0..1 – 零或一个连线可将此引用作为源
o 1..n – 一或多个连线可将此引用作为源
o 0. .n – 零或多个一个连线可将此入口点作为一个源
Multiplicity定义了可被连线到entryPoint的服务数目:
l 1..1 是最简单最常见的情形,在此确切一个服务被连线 – 没有服务被连线到entryPoint是错误的。
l 0. .1 适合能够容许没能服务连线到entryPoint的实现情形,此处服务被连线时系统将正确操作。
l 0..n 与 1..n 适合entryPoint可操纵多个目标服务的情境。这两种情形的区别依据是否实现能够容许无服务连线到entryPoint – 0..n 允许没有服务被连线,而 1..n 至少需要一个。这两种情形中,连线服务的集合都被调用而不只是单个。
l 0..n 很可能在“发布/订阅”事件类型关系中找到用武之地,此处许多服务可接收一个消息,但实现自身即使没有任何收者也可运作。
l 1..n 可能被用在实现想确保至少一个服务获得消息的情形。
一个入口点拥有一个引用,它依次有一个接口。接口被一个interface元素所描述,是entryPoint元素的子元素。有关interface元素的详情请参见接口部分。
既然服务必须由远程入口点所代表,入口点所用的接口参数和返回必须可翻译成绑定指定的连线格式。远程服务的实现在调用期间或之后可能修改输入消息(参数),也可能在调用之后修改返回消息(结果)但不修改输入消息,或在调用后修改对调用者可见的返回参数。
一个entryPoint有一个或多个binding元素作为其子节点。有关binding元素的细节在绑定部分描述。
entryPoint元素有一个reference元素作为其子节点。reference元素的值连线引用到解析引用的服务。有关引用连线的详情参见连线部分。
一个入口点在模块中的定义可能在子系统级别被覆盖。
1.3.8.1 入口点示例
下图展示用于在模块图中代表入口点的入口点符号。

图8:入口点符号
下图展示了包含入口点MyValueService的MyValueModule模块图。

图9:MyValueModule展示入口点
以下片段展示了包含MyValueService entryPoint元素的MyValueModule文件的sca.module文件。入口点MyValueService使用Web服务绑定进行绑定,且连线到发布的MyValueServiceComponent。
<?xml version="1. 0" encoding="ASCII"?>
<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
name="MyValueModule" >
<entryPoint name="MyValueService">
<interface.java interface="services.myvalue.MyValueService"/> <binding.ws port="http: //www.myvalue.org/MyValueService#
wsdl.endpoint(MyValueService/MyValueServiceOAP) "/> <reference>MyValueServiceComponent</reference>
</entryPoint>
…
</module>
下图展示了包含入口点CustomerService的CustomerModule模块图。

图10:具备CustomerService入口点的CustomerModule
以下片段展示了包含CustomerService entryPoint元素的CustomerModule文件的sca.module文件。入口点CustomerService使用SCA远程绑定进行绑定,连线到它发布的CustomerService构件。
<?xml version="1.0" encoding="ASCII"?>
<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
name="CustomerModule" >
<entryPoint name="CustomerService">
<interface.java interface="services.customer.CustomerService"/> <binding.sca/>
<reference>CustomerServiceComponent< /reference>
</entryPoint>
…
</module>
在一个模块内的SCA连线(wire)连接服务引用到服务。有效引用是构件引用和入口点。有效服务是构件服务与外部服务.
如果是连线源的构件或入口点被定义在相同的模块文件或作为连线的相同模块片段文件中,那么连线被构件或入口点配置引用所定义。目标通过解析引用的连线-目标-URI服务进行配置。
如果是连线资源的构件或入口点在不同的模块文件或模块片段文件中被定义,那么wire元素所代表的连线是module元素或moduleFragment元素的子节点。可有在一个模块或模块片段中可有零或多个wire元素。
以下片段展示了具备reference元素构件和入口点的模块schema,及wire子元素。
<?xml version="1.0" encoding="ASCII"?>
<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
name="xs :NCName" >
<entryPoint name="xs:NCName" multiplicity="0. .1 or 1. .1 or 0. .n or 1. .n"?>* <interface . interface-type/>
<binding.binding-type uri="xs :anyURI"/>+
<reference>wire-target-URI< /reference>
</entryPoint>
<component name="xs :NCName">*
<implementation. implementation-type/>
<properties>?
<v:property-name>property-value</v: property-name>+
</properties> <references>?
<v:reference-name>wire-target-URI</v: reference-name>+ </references>
</component>
…
<wire>*
<source.uri>wire-source-URI</source.uri> <target.uri>wire-target-URI</target.uri> </wire>
</module>
构件的<reference-name>元素及入口点的reference元素都可有以下连线-目标-URI值:
l <component-name>/<service-name>
o如果源构件只有一个,那么服务名称规范是可选的
l <externalReference-name>
l 或者绑定到指定的端点地址
o 例如:http://www.NEWstockquote.org/services/StockQuote
连线有以下子元素:
l source – 构件或入口点的名称,有效URI scheme为
o <component-name>/<reference-name>
|