SCA规范学习装配规范Word格式.docx
- 文档编号:20279861
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:31
- 大小:1.22MB
SCA规范学习装配规范Word格式.docx
《SCA规范学习装配规范Word格式.docx》由会员分享,可在线阅读,更多相关《SCA规范学习装配规范Word格式.docx(31页珍藏版)》请在冰豆网上搜索。
比如一个SCA组件可以向外部提供一个ws的服务,同时在该服务的实现中加入一个corba服务的引用。
这样,用户就可通过调用ws服务的方式,实现对corba服务的调用。
且tuscany的扩展机制允许针对新的协议加入自定义的绑定。
实现消息格式的转换:
通过数据绑定实现。
TuscanySCA支持的数据类型有XML、SDO、JAXB、DOM、JSON等等,其内部有一个消息转换器来实现不同格式消息之间的转换,这种转换机制并不都是一一对应的,而是传递的。
比如SDO要转换成AXIO,但Tuscany并没有实现这两种格式的直接转换,而是将SDO转换成StAX,然后StAX再转换成AXIO。
具体的转换路径使用Dijkstra最短路径算法获得。
而数据绑定是绑定中的子元素,相当于tuscany已经实现格式转换,并且同样允许自定义的数据绑定加入。
处理不同来源的业务:
相当于支持处理同步、异步的事件。
SCA在向外界提供服务时,可以选择同步和异步两种方式(异步细分为Asynconeway、Deferredresponse和Callback),用以处理不同来源的业务。
消息路由和数据集成,以及服务的加入(注册),删去(注销),修改(更新)是需要加入的功能。
以SCA架构为基础,或者说以Tuscany为基础实现ESB能节省很多工作。
SCA规范学习:
SCA装配规范
在SCA中,构件(或组件)是最小单元,多个构件可以构成组合构件,组合构件用以完成某个或某些相关的功能。
构件有其具体的实现(即代码),而组合构件的创建与配置则需要SCDL文档来实现。
SCA装配规范即是针对构件不同的装配需求而规定了SCDL文档该如何写。
本学习文档针对规范中提到的SCDL文档中一些重要元素,采用结合tuscany中的例子的方式来帮助理解这些概念。
Component
以下为带有component元素的XMLschema
<
componentname="
xs:
NCName"
requires="
listofxs:
QName"
?
autowire="
boolean"
requires="
policySets="
constrainingType="
>
*
implementation/>
servicename="
policySets="
interface/>
bindinguri="
anyURI"
/>
/service>
referencename="
multiplicity="
0..1or1..1or0..nor1..n"
autowire="
target="
policySets="
wiredByImpl="
requires="
/reference>
propertyname="
(type="
|element="
)?
mustSupply="
many="
source="
string"
file="
property-value?
/property>
/component>
Component元素有如下属性:
•name(必须)–构件的名字。
在同一组合构件里的所有构件中名字必须唯一。
•autowire(可选)–指示包含的构件引用是否自动连线,默认是false。
•requires(可选)–策略意图的列表。
(策略框架规范)
•policySet(可选)–策略集列表。
•constrainingType(可选)–强制类型的名字。
当指定时,构件的服务、引用和属性的集合,加之相关的意图将被限定为强制类型定义的集合。
component元素有0个或者1个implementation子元素,该子元素指定构件所使用的实现。
Service
component元素有0个或多个service子元素,用于配置构件的服务。
可配置的服务是由实现定义的。
service元素有如下属性:
•name(必须)–服务名字。
必须匹配由实现定义的服务名。
•requires(可选)--策略意图的列表。
•policySets(可选)--策略集列表。
service元素有0个或者1个interface子元素。
如果没有指定接口,那么实现为服务指定的接口有效。
如果指定了接口,就必须提供一个与实现提供的接口相兼容的子集。
service元素有0个或多个binding子元素。
如没有指定binding,那么实现为服务指定的binding有效。
如果指定了,那些绑定会覆盖实现所指定的绑定。
Reference
component元素有0个或多个reference子元素,用于对其他服务的引用。
reference元素有如下属性:
•name(必须)–引用名。
必须匹配实现中定义的引用名称。
•autowire(可选)–指示引用是否自动连线,默认是false。
•requires(可选)–策略意图的列表。
•multiplicity(可选)–定义了能连接到目标服务的引用的连线数目。
1..1,0..1,1..n,0..n
•target(可选)–一个或多个目标服务URI的列表,依赖于multiplicty的设置。
•wiredByImpl(可选)–一个boolean值。
默认”false”,指示实现动态地连线该引用。
如果设置为“true”,表示这个引用的目标由实现代码在运行时设置。
reference元素有0个或者1个interface子元素。
(含义与service中相同)
reference元素有0个或多个binding子元素。
component元素有零个或多个property子元素。
该子元素用于配置实现的属性数据值。
其值可以通过多种方式获得。
(属性元素直接赋值;
通过引用包含该component的composite中某个属性来赋值;
通过文件赋值)
component的SCDL文档例子
该例子是一个由两个component构成的composite,实现加法计算器功能,结构如下:
AddServiceComponent实现加法功能,采用AddService接口,即其它本地类可以以AddService接口调用它
CalculatorServiceComponent实现CalculatorService接口(其它本地类可以以CalulatorService接口调用它),且其实现类调用了AddService接口(本地方式)
注:
该例子中的连线都是本地方式,通过SCA的装配方式,可以直接完成接口到具体实现的对应,不用从Java代码中新建接口类,指定接口的实现。
例1:
(例1作为第一个SCDL文档学习,会比较详细)
AddServiceComponent"
<
implementation.javaclass="
AddServiceImpl"
定义了一个名为AddServiceComponent的构件,并指定了它的实现类。
AddServiceImpl代码如下:
publicclassAddServiceImplimplementsAddService{
publicdoubleadd(doublen1,doublen2){
returnn1+n2;
}
}
现在需要定义一个新的构件,名称为CalculatorServiceComponent。
该构件需要引用AddServiceComponent构件。
首先,我们定义一个名为AddService的Interface和一个名为CalculatorService的Interface
代码如下:
publicinterfaceAddService{
doubleadd(doublen1,doublen2);
publicinterfaceCalculatorService{
相应的,在实现CalculatorServiceComponent构件的java文件
CalculatorServiceImpl.java中,应有以下代码:
publicclassCalculatorServiceImplimplementsCalculatorService{
privateAddServiceaddService;
@Reference
publicvoidsetAddService(AddServiceaddService){
this.addService=addService;
returnaddService.add(n1,n2);
代码中使用了@Reference注释,表明该方法中含有引用。
而在CalculatorServiceComponent构件的SCDL文档部分,应该有以下内容:
CalculatorServiceComponent"
<
implementation.javaclass="
CalculatorServiceImpl"
addService"
/>
指定了实现类,指明了reference的服务名称是addService(对应代码中,即是方法setAddService中的参数addService。
此处的名称一定要一致,不然引用会失败),并且指明了addService的target是AddServiceComponent。
最后将这两个component装配成一个composite。
完整的SCDL文档如下:
compositexmlns="
http:
//www.osoa.org/xmlns/sca/1.0"
targetNamespace="
//sample"
xmlns:
sample="
name="
Calculator"
implementation.javaclass="
/composite>
测试调用:
编写一个测试类
publicclassCalculatorClient{
publicstaticvoidmain(String[]args)throwsException{
SCANodeFactoryfactory=SCANodeFactory.newInstance();
SCANodenode=
factory.createSCANodeFromClassLoader("
Cposite"
CalculatorClient.class.getClassLoader());
node.start();
//初始化部分将在SCA规范JAVA实现部分中进一步学习
CalculatorServicecalculatorService=
((SCAClient)node).getService(CalculatorService.class,"
);
//Calculate
System.out.println("
3+2="
+calculatorService.add(3,2));
node.stop();
运行后得到结果:
2010-12-2019:
36:
30org.apache.tuscany.sca.node.impl.NodeImpl<
init>
信息:
Creatingnode:
Cposite
30org.apache.tuscany.sca.node.impl.NodeImplconfigureNode
Loadingcontribution:
file:
/D:
/tuscany-sca-1.6.1-src/samples/calculator/target/classes/
31org.apache.tuscany.sca.node.impl.NodeImplstart
Startingnode:
3+2=5.0
31org.apache.tuscany.sca.node.impl.NodeImplstop
Stoppingnode:
该例子通过代码中的@Reference以及SCDL中对reference元素name属性和target属性的定义,将AddService接口的实例addService链接到了接口的实现部分(AddServiceImpl.java)。
例2:
同样是例1中的calculator加法功能,这次我们用ws的方式提供add服务,这需要在接口AddService中添加@Remotable注释:
@Remotable
同时,在其实现类中添加@Service注释
@Service(AddService.class)
调用该服务的CalculatorServiceImpl.java不用做任何改动。
而相应的,SCDL文档改为:
>
interface.javainterface="
AddService"
binding.wsuri="
//localhost:
8080/sample-calculator-ws-webapp/AddServiceComponent"
binding.ws/>
AddServiceComponent构件中声明了服务,该服务的接口名称以及该服务的绑定协议。
CalculatorServiceComponent构件中指明了引用服务的接口名称,绑定协议以及该ws服务的具体接入点(uri)
该例子通过@Remotable注释和@Service注释的使用,结合reference元素和service元素中interface子元素和binding子元素的帮助,完成了对于一个ws服务的调用。
Composite
Composite被用于在逻辑分组中装配SCA元素。
其在SCA域中是组合的基本单元。
SCA组合构件包含一系列的Componet,Service,Reference以及内连它们的wire和像外部暴露它们的promotion,外加上用于配置构件的一系列property。
composite元素有如下属性:
•name(必须)–组合构件的名字。
组合构件名字的形式是一个XMLQName,在由targetNamespace属性标识的命名空间中。
•targetNamespace(可选)–composite声明所在的目标命名空间标识符
•local(可选)–composite中的所有component是否必须运行于同一个操作系统进程。
Local=”true”指示所有的构件运行于同一进程。
Local=”false”,是默认值,指示composite里的不同的构件运行于不同的操作系统进程,这些component可能运行在某个网络的不同节点上。
•autowire(可选)–被包含的构件引用是否自动连线,默认为false。
•constrainingType(可选)–constrainingType的名字。
当指定的时候,组合构件的服务,引用和属性的集合,再加上相关的意图,都会受限于costrainingType所定义的设置。
•policySets(可选)–策略集列表。
composite包含0个或多个property,service,component,reference,wire以及includedcomposites。
Composite与Component关系:
Component包含配置化的实现,该实现承载其Composite的业务逻辑。
Component提供服务并引用其他的服务。
Composite定义了Composite所提供的公开服务,这些服务能被Composite的外部访问(采用promotion)。
Composite引用描述该Composite依赖于其外部其他地方所提供的服务。
wire描述Composite中的Component服务与Component引用之间的连接。
关于promotion:
Composite级别的服务是对该Composite中某一个Component的某一服务的提升。
即Composite服务实际上是由其内部的一个Component所提供的。
Composite级的引用是对一个或多个Component的一个或多个引用的提升。
只要所有的Component引用相互兼容,多个Component引用能被提升为同一个Composite的引用。
在多个Component引用被提升为同一个Composite的引用的地方,它们都共享相同的配置,包括相同的目标服务。
Composite中的reference元素:
与component中的reference类似,当多了一个promotion的子元素,且在composite的reference中,promotion子元素是必须的。
•promote(必须)–标识一个或多个被提升的构件引用。
该值是用空格分隔的,形式为
component-name>
/<
reference-name>
的值的列表。
如果构件只有一个引用,那么对引用名的指定是可选的。
另外,composite的引用可选地指定一个接口(interface),multiplicity
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SCA 规范 学习 装配