第一天来到博客园,说实话,并不知道该发些什么样内容会好一些,我最想的是弄点工作流方面的东西,可惜很多思想方面的东西没有整理出来,之前
空闲的时间也重新将jbpm数据库表切分一些,更方便于查阅,但是一直没有完成,主要工作忙的事情不停,最近整合需要给公司出一份Tuscany的开
发文档,故此也整理了这些天的东西;也希望能与大家交流,其中也有很多值得推敲的地方,很多地方也只是我的臆测,如有错误还请指出,多多交流;
那么我们开始吧:
What is SCA?
SCA为构建基于SOA的应用和解决方案提供了编程模型。它基于这样的理念:将业务功能作为一系列的服务而提供,并由这一系列的
服务组装起来的解决方案来满足特定业务需求。这些组合的应用既包括为应用而新创建的特定服务,也包括源自已已存在系统和应用
的业务逻辑,这些业务逻辑作为组合构件的一部分被复用。
SCA既为服务的组合也为服务构件的创建提供了模型,包括对SCA组组合构件中对已存在应用功能的复用。SCA就是一个致力于为服
务构件以及连接各服务构件的访问方式而包容各种广泛的技术模型。对于构件,不仅仅只是不同的编程语言,还包括那些编程语言普
遍使用的框架和环境。对于访问方式,SCA组合允许使用广泛采用的各种通讯和服务访问技术。其中包括如Web service、Messaging
系统以及远程过程调用(RPC)技术等。
----摘自< SCA装配模型V100中文版>
SCA是IBM做针对SOA实现,提出的具体实现规范,与ESB集成的概念不同,IBM拥有整套对于SOA架构及治理的解决方案,SOA的解决方案中一部分,而非全部,故此它是以组件的层次来看待交互,而非SOA全局立场进行构建;
IBM给出的SOA架构:
表现层/服务消费者层/数据交换层 -> 业务流程层-> 服务层 -> 服务组件层 ->资源库层
记得很久以前,IBM曾经提出过 SOA = BPEL+SCA+SDO 模型;
从架构图中我们可以看出,此SOA架构图完全是此模型扩展而至,SCA贯穿的是下三层;
SCA组件模型:
我们看得出,重点为4种 : 实现(implements),服务(service),属性(properties),引用(reference);
属性相当于工作流中数据源(context),传递的变量,使用度说实话实在不高,故此其实真正的有用概念=组件,服务,引用;
叙述他们之间的关系:
之前看过一本<分布式Java应用:基础与实践 >,里面SCA的组件,服务,引用的关系图,画得很到位;
至于官网的关系图,只能用烂来表示了,我本想找来那本书里图,结果在网上没找到,不给力啊!
所以只能用官网的图来凑合下,如果有条件,看一看下分布式应用里面的图,再有那本书挺不错的,特别对内存的分析方面;
大约意思是这样使用component type配置文件来约束component,每个component都拥有一个实现,而每个实现都有一个接口;
component type几乎没什么用,现在都用注解了,一般不用他,甚至后期可以使用spring来管理,因此此配置文件用途不大;
域(Domain)
域,对于分布式部署,是最重要的概念之一;
逻辑上,它是一个很模糊的概念,
理论:SCA Domain描述一个完整的运行时配置,潜在地可以被部署到一系列内连的运行时节点上;
应用:它是一个容器,更是一个系统边界,决定域与域的交互;
官方的说法:
SCA域非常灵活,可以很小也可以很大:
一个很小的域,可能是一个在测试环境内;
中型域可能是一个单一的服务器还是小型集群,支持单一应用;
大型的域可以描述一个部门或公司的全部服务;
域 - 这个概念在各个方面内都有出现,如ESB中有企业域,部门域等概念,SSO有跨域访问的概念,SOA有域库存的概念;
域来讲是对外是一个整体,对内由不同的应用组件而成;
SCADomain,域的大小是由我们自由定义,一般来讲会定义层较大的域,因为同一域内可以使用引用的方式,域外是绑定;
不过具体还要看业务上决定,从效率上,个人更倾向于企业域;
代码:
创建域:
SCADomain domain = SCADomain.newInstance( " com/config/simple/echo.composite " );
SCADomain初始化:
1.创建需要使用的创建classLoader; 如 -
final ClassLoader runtimeClassLoader = SCADomain. class .getClassLoader();
2. 查找扩展配置文件,并获取扩展SCADomain实现类 -
Class <?> implClass = ServiceDiscovery.getInstance().loadFirstServiceClass(SCADomain. class );
3. 创建SCADomain实例;
3.1 没有扩展SCADomain实现时,创建默认SCA域实现;
new DefaultSCADomain(runtimeClassLoader, applicationClassLoader, domainURI, contributionLocation,composites);
3.2 拥有扩展SCADomain实现时,创建扩展SCA域实现;
constructor = implClass.getConstructor(ClassLoader. class , String. class );
domain = (SCADomain)constructor.newInstance(runtimeClassLoader, domainURI);
4.返回SCADomain实例;
源码:
1 static SCADomain createNewInstance(String domainURI, String contributionLocation, String... composites) {
2 // TODO 创建SCA域
3
4 SCADomain domain = null ;
5
6 try {
7 // 获取域的classLoader
8 final ClassLoader runtimeClassLoader = SCADomain. class .getClassLoader();
9 // 获取应用的classLoader
10 final ClassLoader applicationClassLoader = Thread.currentThread().getContextClassLoader();
11 // 查找扩展配置文件,并获取扩展SCADomain实现类
12 Class <?> implClass = ServiceDiscovery.getInstance().loadFirstServiceClass(SCADomain. class );
13 // 如果没有自定义扩展的域,则采用默认实现
14 if (implClass == null ) {
15
16 // 创建默认的实现
17 domain =
18 new DefaultSCADomain(runtimeClassLoader, applicationClassLoader, domainURI, contributionLocation,
19 composites);
20 } else {
21 // TODO 创建扩展域实例
22
23 // 拥有构造方法集合
24 Constructor <?> constructor = null ;
25 try {
26 constructor =
27 implClass.getConstructor(ClassLoader. class ,
28 ClassLoader. class ,
29 String. class ,
30 String. class ,
31 String[]. class );
32 } catch (NoSuchMethodException e) {
33 }
34 if (constructor != null ) {
35 domain =
36 (SCADomain)constructor.newInstance(runtimeClassLoader,
37 applicationClassLoader,
38 domainURI,
39 contributionLocation,
40 composites);
41 } else { // 使用继承的扩展SCA域的构造方法
42 constructor = implClass.getConstructor(ClassLoader. class , String. class );
43 domain = (SCADomain)constructor.newInstance(runtimeClassLoader, domainURI);
44 }
45 }
46
47 // FIXME: 定义为全局对象 - 静态
48 theDomain = domain;
49
50 return domain;
51
52 } catch (ServiceRuntimeException e) {
53 throw e;
54 } catch (Exception e) {
55 throw new ServiceRuntimeException(e);
56 }
57 }
呵呵,刚刚开始,比较简单,后面会有一些关于遇到的问题,以及没有解决的问题等等,争取一天写一篇博文,哈;