- 概况
- 内部高层视图
- Bootstrap
- 装配模型
- 分发包
- 绑定扩展
- 构件实现扩展
- 数据绑定扩展
- 复合激活
- 加载SCA组件
- 与Spring集成
- Spring作为构件实现
- Spring作为IOC容器
概况
SCA JAVA 运行时是由内核和扩展两部分组成。内核本质上是一个连接多个VM的引擎,使用依赖注入(Dependency Injection)和控制反转( Inversion of Control)将构件连接在一起。
内核
其核心是设计简单和功能有限的。它将不同的功能单元连接到一起,并且提供SPIs以让扩展之间可以互动,例如服务发现,可靠性,支持透明协议,等等。这些功能都以扩展的方式提供。
扩展
扩展提高了SCA运行时的功能型。扩展类型并不固定,Tuscany的核心通过提供一个可调整的模型的设计使其尽可能的灵活。现在,已知的扩展类型有:
- 组件实现类型:例如,spring、Groovy、Javascript
- 绑定类型:例如:Axis、CXF、AMQP、ActiveMQ、JXTA
- 数据绑定类型:例如,JAXB、SDO、XmlBeans
- 接口绑定类型:例如,WSDL、Java
具体细节可参考扩展开发向导
JAVA SCA 运行时高层次概览
下图是Java SCA运行时的一个高层次概览,其中包括以下关键模块:
- SCA规格API:SCA JAVA客户端的API和执行规格
- API:实现SCA规格API的Tuscany API
- 接口绑定:支持服务定义的类型,例如WSDL、Java……
- 数据绑定:实现数据支持,例如SDO、JAXB……
- 主机平台:提供Tuscany运行时的环境
bootsrap
Bootstrap 进程受主机环境控制。默认进程是由DefaultBootstrapper实现的。运行时进程服务使用SCA XML形式进行集成,也可以采用其他形式:
- 加载阶段处理SCDL,并在内存中创建一个对应的运行时对象(例如:组件、服务、引用)
- 连接线将引用连接到服务
集成模型
SCA的装配模型在Tuscany中是通过一系列接口实现的。以下是一些关键件:
- SCA组件是由SCA实现的实例配置而成,它提供和销毁服务
- SCA服务用以声明外部可访问的服务实现
- SCA引用表示一个对其他服务实现的引用,这里被使用的服务通过配置指定
- 一种实现表示一种软件技术,例如Java类、BPEL流程、XSLT转换、或者C++类,用以在SOA应用中实现一个或多个服务。一个SCA集成也是一个实现。
- 组件类型指的是可配置的实现方式
- 接口定义了一个或多个业务功能,这些业务功能的实现由服务提供,通过引用为组件所使用,服务是由实现的接口所定义的,SCA目前支持两种类型的接口:
- 一个SCA Composite十一个SCA域中的基本单元,它由组件、服务、引用、它们之间的连线组成。
- SCA联结了服务引用和服务
- 服务和引用之间使用绑定联结。引用使用绑定描述服务之间相互访问的机制,服务使用绑定描述客户端访问服务的机制
- 属性允许在外部实现的配置进行设值,数据通过组件也可能源自于一个组合件的属性提供。
发布
Tuscany运行时提供了一个框架,以支持SCA发布。该框架可针对以下扩展点进行扩展:
PackageProcessorExtensionPoint:负责处理不同的包或者档案格式,例如:文件夹、JAR包、osgi包、EAR、WAR以及ZIP。
ArtifactProcessorExtensionPoint:负责处理具体类型的服务,例如:WSDL、XSD、构件、JAVA类、BPEL。
- 包处理器在安装时扫描发布包,并且创建一个待处理列表,目前支持文件夹/文件系统和jar发布包,为了对发布包可用,包处理器程序需要通过包处理器扩展点进行自我注册。
- 组件处理器被用来处理发布包中的组件,为了保持对发布服务可用,组件处理器需要使用组件处理扩展进行自我注册,组件处理器会在以下两个步骤进行调用:
- 读
取:
在这里你可以读取一个组件(一个文档、XML、类等等),实例化一个代表组件的模型并销毁它。SCA发布服务对注册了ArtifactProcessor
的组件调用ArtifactProcessor.read() 方法,如果你的模型对另外一个模型有引用,不要试图也立即实例化另一个模型,你应该只保留
引用信息,在处理阶段这将变成一个指针,注意现在你没必要完全读取并实例化你的模型,可以延迟实例化。
- 处理:本阶段给你机会使你可以处理对其他模型的引用(WSDL,类,其他复合组件,或者一个组件类型(componentType))。这时,所有代表发布包里组件的模型被全部读取出来,并且在发布的 ArtifactResolver进行注册,准备处理。
- 所有可以部署的复合组件都应该部署在SCA域
实现扩展
实现扩展负责支持实现方式的类型:比如Java、Script、BPEL等。
绑定扩展
绑定扩展负责支持绑定方式的类型:Web服务、JMS、JSON-RPC以及RMI。
接口扩展
接口扩展负责支持接口的类型,例如Java接口和WSDL1.1 portType。
数据绑定扩展
请参考Tuscany Databinding Guide。
复合组件激活
在一个复合组件在配置好以后,它可以在SCA域进行激活,Tuscany运行时通过以下步骤去激活它:
1、构建:在此阶段,复合组件被进一步常态化,以更容易和运行时互动,元数据在服务/引用升级以后进行合并。基于扁平的模型,我们可以在构建级获取全部的信息。
2、配置:在此阶段,复合组件的层次被引导到配置一个组件的实现,在组件间以及组件和外部服务之间,引用绑定和服务绑定会在以后的步骤中用来创建运行时连接。
3、创建运行时连接:
在此阶段,通过选定的绑定方式,创建了组件引用和组件服务的运行时连接。运行时连接是调用链的集合。每个执行链包含一组执行器和拦截器。执行器为绑定协议
和实现技术提供调用的逻辑,拦截器是一种特殊的执行器,它为方法执行提供了附加的逻辑,例如数据转换以及交易控制。对于一个组件引用来说,我们创建运行时
连接来表示通过绑定的对外执行;对于组件服务呢,我们创建运行时连接表示对实现类型的向内连接。回调连接可以被附加到组件服务之上,表示来自服务的回调执
行。
4、启动服务组件:在这个阶段,ImplementationProvider,
ReferenceBindingProvider和ServiceBindingProvider 定义的start()
回调方法将被调用,最后,组件、组件引用以及组件服务被初始化去服务组件间的互动。服务监听器被启动已接受从绑定层来的连接请求。
调用概况
1、调用被分派到WireInvocationHandler
2、WireInvocationHandler 寻找正确的InvocationChain
3、创建一条消息,设值payload,设值TargetInvoker,然后将消息通过链向下传递
4、当消息到达链的底部后,TargetInvoker 会被调用,它按顺序对目标进行调度
5、当将TargetInvoker 存储后,当连接源的可视范围等于或小于目标时(例如:request-》composite),外向端允许将目标实例进行缓存。
运行时提供具有InboundWires 和OutboundWires的构件。InvocationChains 被构件连接所持有,因此它是无状态的,允许引入新的拦截器以及重新连接等动态事件的发生。
加载SCA部件
组件处理器
组件处理器被用来处理发布包中的组件,为了保持对发布服务可用,组件处理器需要使用组件处理扩展进行自我注册,组件处理器会在以下两个步骤进行调用:
- 读取:
在这里你可以读取一个组件(一个文档、XML、类等等),实例化一个代表组件的模型并销毁它。SCA发布服务对注册了ArtifactProcessor
的组件调用ArtifactProcessor.read() 方法,如果你的模型对另外一个模型有引用,不要试图也立即实例化另一个模型,你应该只保留
引用信息,在处理阶段这将变成一个指针,注意现在你没必要完全读取并实例化你的模型,可以延迟实例化。
- 处理:本阶段给你机会使你可以处理对其他模型的引用(WSDL,类,其他复合组件,或者一个组件类型(componentType))。这时,所有代表发布包里组件的模型被全部读取出来,并且在发布的 ArtifactResolver进行注册,准备处理。
加载JAVA SCA
SCA服务部件在SCA里以SCDL文件的形式进行部署,Tuscany运行时组件处理器加载这些SCDL到模型对象,这些对象包含了元数据。
有两种主要的加载器:
1、StAXElementLoader:从StAX 事件加载XML
2、ComponentTypeLoader:为一个实现加载组件类别或者处理一个文件
加载组件类别
为实现规范加载组件类型定义
1、如何实现是实现规范
运行时组件的类图