王洪伟的专栏

http://blog.teamlet.org 本站搜索关键字:王洪伟+teamlet

王洪伟ID:teamlet
155392次访问,排名449好友1人,关注者44
10年软件开发设计经验,专注J2EE领域的技术架构和应用.
teamlet的文章
原创 95 篇
翻译 9 篇
转载 67 篇
评论 135 篇
teamlet的公告

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享. 转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议.

关注SOA技术的发展,跟进SCA技术的理论和实现,努力实践。愿与同行者一起分享,互相勉励,共同进步。
最近评论
SNOW:还请问一下,我按照你的说明步骤操作,
出现org.apache.axis2.engine.DependencyManager.configureBusinessLogicProvider 未定义
getElement() 未定义,
请问这是什么原因呢?
陈森虎:常看王老师的东西,自已不会学,只有顶一下了
lixinso:可以使用代理吧,ultralsurf,很好用
sse:想请教您gforge的安装过程中,按照您 的安装配置过程一步步进行,可是今天来了重启后http.conf 里有个模块加载不上, LoadModule php5_module modules/libphp5.so
LoadModule dav_svn_module modules/mod_dav_svn.so请问好何解决。邮箱是cqupt_wang@hotm……
xaser:GOOGLE一下“Vidalia Bundle”,安装后就能正常访问SF了,也能正常下载文
文章分类
收藏
    相册
    资源联接
    Cruise Control
    Open CSA
    OSOA
    SOA Tools Project
    theserverside
    中国Java开发网
    满江红
    知识共享@中国大陆
    左邻右舍
    donews的blog
    msn的blog
    Tuscany中文社区
    我用Subversion
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Tuscany SCA V1.0中的扩展机制和启动过程中的扩展点[11月29日更新]收藏

    新一篇: 细说SCA V1.0规范(3) -- Domain与业务 | 旧一篇: 开源框架思索

     

     

    2007年9月24日Tuscany SCA 发布了V1.0版本的实现 。本文讲述的内容使用的就是基于这个版本的,代码下载地址 http://incubator.apache.org/tuscany/sca-java-10-incubating.html

     

    一、Tuscany SCA 运行时的组成

            Tuscany SCA V1.0 与前面的几个版本相比,在结构上发生了很大的变化。这种变化是意料之中的,但变化之快却是始料不及的。前面几个版本结构比较僵化、组织复杂,对变化的适应性差。如果SCA规范稍有变动,在结构上很难快速的适应,代码的变化就更不用说了。

            Tuscany SCA V1.0版本将Tucany SCA 运行时(Runtime)分成两部分,核心部分和扩展部分。核心部分的实质是利用IoC (Inversion of Control)或者DI (Dependency Injection)原理将分开的逻辑和实现,通过扩展机制实现联系和匹配;在扩展部分的结构上使用多级扩展。这种机制带来更加灵活的扩展能力和动态特性。关于Ioc或者DI可以参看相关的文章。

          通过扩展点将功能结构分解分散,减少了核心部分的对象和操作,使核心部分结构更加清晰,紧凑。这让我想起了章鱼:一个小小的头和长长的八只爪。我想不久,Tuscany SCA在结构上还会做进一步的改进。

     

    二、"芝麻开门"——Tuscany SCA V1.0 的启动点

    Tuscany SCA V1.0的启动是从SCADomain开始的,从上向下,由外到内逐步细化。SCADomain是一个抽象类,对应规范中的Domain组件。SCADomain通过其实现类获得Domain组件的实例。SCADomain 有几个实现类,关系如下图:

    当执行 SCADomain.createInstance("someComposite") 时,SCA 的启动开始!

     

    三、启动环境的准备

    DefaultSCADomain是SCADomain的一个实现类。SCADomain.createInstance()通过DefaultSCADomain构造一个SCADomain类型的实例。这个DefaultSCADomain实例,包含了一个运行时(Runtime)对象——ReallySmallRuntime。

    ReallySmallRuntime 主要作用就是实现扩展机制,做了大量的扩展点匹配的工作。

     

    四、扩展机制

            扩展机制包含两个部分:扩展类型和扩展点。扩展类型和扩展点的关系是接口和实现类的关系。
    扩展类型声明的方法在扩展点中被实现;扩展点是一个接口,而扩展点是实现了这个接口的类。

    在程序中,通过什么方法调用即避免在代码中不出现扩展点(实现类),还可以通过扩展类型(接口)使用这些扩展点(实现类)呢?来看看下面的代码:

    ExtensionPointRegistry registry = new DefaultExtensionPointRegistry();
    WorkScheduler workScheduler 
    = registry.getExtensionPoint(WorkScheduler.class);

    解释一下上面两行代码:

    1、ExtensionPointRegistry是一个扩展点注册接口。在ExtensionPointRegistry 中声明的方法通过DefaultExtensionPointRegistry实现,通过ExtensionPointRegistry 接口来使用。

    2、通过DefaultExtensionPointRegistry的实例registry来获取扩展类型为WorkScheduler.class 的扩展点,并返回一个扩展类型的实例。

    ExtensionPointRegistry在这里起到了匹配、实例化、类型转换、存储的作用。

    首先,通过ServiceConfigurationUtil.getServiceClassNames()方法匹配扩展点,方法如下。

    public static List<String> getServiceClassNames(ClassLoader classLoader, String name) throws IOException {
            List
    <String> classNames = new ArrayList<String>();
            
    for (URL url: Collections.list(classLoader.getResources("META-INF/services/" + name))) {
                InputStream is 
    = url.openStream();
                BufferedReader reader 
    = null;
                
    try {
                    reader 
    = new BufferedReader(new InputStreamReader(is));
                    
    while (true) {
                        String line 
    = reader.readLine();
                        
    if (line == null)
                            
    break;
                        line 
    = line.trim();
                        
    if (!line.startsWith("#"&& !"".equals(line)) {
                            classNames.add(line.trim());
                        }
                    }
                } 
    finally {
                    
    if (reader != null)
                        reader.close();
                    
    if (is != null) {
                        
    try {
                            is.close();
                        } 
    catch (IOException ioe) {}
                    }
                }
            }
            
    return classNames;
        }

    其中,String name参数是 WorkScheduler.class.getName()的值,即包含全部包在内的全路径名。
    WorkScheduler.class.getName() = "org.apache.tuscany.sca.work.WorkScheduler";

    在("META-INF/services/"路径下,会有一个以"org.apache.tuscany.sca.work.WorkScheduler"为名称的文件,文件内容为:

    # Licensed to the Apache Software Foundation (ASF) under one
    # or more contributor license agreements.  See the NOTICE file
    # distributed with this work for additional information
    # regarding copyright ownership.  The ASF licenses this file
    # to you under the Apache License
    , Version 2.0 (the
    "License"); you may not use this file except in compliance
    # with the License.  You may obtain a copy of the License at

    #   http://www.apache.org/licenses/LICENSE-
    2.0

    # Unless required by applicable law or agreed to in writing
    ,
    # software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    # KIND
    , either express or implied.  See the License for the
    # specific language governing permissions and limitations
    # under the License.

    org.apache.tuscany.sca.core.work.Jsr237WorkScheduler

    所以,ServiceConfigurationUtil.getServiceClassNames()返回的List类型的classNames里面有一个值,为:org.apache.tuscany.sca.core.work.Jsr237WorkScheduler

    然后,实例化、存储、类型转换:

    public <T> T getExtensionPoint(Class<T> extensionPointType) {
               List<String> classNames = ServiceConfigurationUtil.getServiceClassNames(classLoader, extensionPointType.getName());
                    
    if (!classNames.isEmpty()) {
                        Class
    <?> extensionPointClass = Class.forName(classNames.iterator().next(), true, classLoader);
                        Constructor constructor 
    = extensionPointClass.getConstructor();
                        Object extensionPoint 
    = constructor.newInstance();
    }
           addExtensionPoint(extensionPoint);
           return extensionPointType.cast(extensionPoint);
    }

    这样,通过ServiceConfigurationUtil.getServiceClassNames()查找与扩展类型匹配的扩展点,利用ExtensionPointRegistry.getExtensionPoint()方法实现实例化、类型转换、存储,实现了扩展机制。

     

    五、启动过程中的扩展类型分级一览

    除了上面列举的一些扩展类型之外,还有两个扩展类型需要特别说明。一个是XMLInputFactory扩展类型;另一个是ModuleActivator扩展类型,这个扩展类型不在上面的表中。

    [2007年11月29日新增以下内容]

    上面所列举的扩展类型,在其"META-INF\services"目录中都有对应的匹配文件,这个文件就是扩展类型类的全路径名称, 即包括完整的(package)包名的类名,但是不包括扩展名(不包括.Class).


    但是XMLInputFactory这个扩展类型,你却无法在Tuscany的代码中找到任何的匹配文件。
    这是因为在Tuscany引用的一个jar中包含了一个XMLInputFactory的匹配文件;
    这个jar位于D:\tuscany-sca-1.0-incubating\lib的wstx-asl-3.2.1.jar\META-INF\services中.
    这是XMLInputFactory扩展类型与其它扩展类型不同的地方,还有一个扩展类型也与众不同,就是ModuleActivator.

    上述扩展类型都几乎只有一个匹配文件,在匹配文件中可能有几个继承了这个扩展类型的扩展点,但是数量还是相对较少.ModuleActivator拥有众多的扩展匹配文件,目前找到的有11个匹配文件.这意味着ModuleActivator提供了非常丰富和灵活的应用,这些扩展点是
    org.apache.tuscany.sca.binding.ejb.EJBBindingsActivator
    org.apache.tuscany.sca.binding.notification.NotificationBindingModuleActivator
    org.apache.tuscany.sca.core.databinding.module.DataBindingModuleActivator
    org.apache.tuscany.sca.extension.helper.impl.ImplementationsActivator
    org.apache.tuscany.sca.extension.helper.impl.BindingsActivator
    test.crud.module.CRUDModuleActivator
    org.apache.tuscany.sca.http.jetty.module.JettyRuntimeModuleActivator
    org.apache.tuscany.sca.http.tomcat.module.TomcatRuntimeModuleActivator
    org.apache.tuscany.sca.host.webapp.WebAppModuleActivator
    org.apache.tuscany.sca.implementation.java.module.JavaRuntimeModuleActivator
    org.apache.tuscany.sca.implementation.notification.NotificationModuleActivator
    org.apache.tuscany.sca.osgi.runtime.OSGiRuntimeModuleActivator

     

    <待续>

    发表于 @ 2007年10月05日 23:09:00|评论(loading...)|编辑

    新一篇: 细说SCA V1.0规范(3) -- Domain与业务 | 旧一篇: 开源框架思索

    评论

    #sca 发表于2007-10-07 10:29:02  IP: 59.65.163.*
    先支持 再看看
    呵呵
    #支持一下 发表于2007-10-08 11:12:34  IP: 59.64.12.*
    为什么介绍的时候要介绍这些东西呢
    结合一个实例一步步写  
    那样效果更好
    也更容易懂啊
    结合组件  业务构件 绑定  引用 属性 连线
    服务组合 服务调用 这些概念来讲是不是更好啊
    讲这些理论 看起来感觉有些茫然啊 呵呵
    感谢LZ的精神  国庆都没有休息啊
    也希望其他看到文章的支持一下
    让LZ继续写下去啊
    #AA 发表于2007-10-10 15:19:20  IP: 59.64.12.*
    有个问题不是很明白:
    SOA 将解决方案设计为服务的组装,通过定义良好的接口和契约进行连接。
    实现SOA的技术方式有很多种,比如CORBA,DCOM,J2EE甚至RPC技术.但是使用最广泛的是Web Service.
    服务组件体系结构 (SCA) 作为SOA的一个规范,它描述用于使用 SOA 构建应用程序和系统的模型。那么SCA用什么技术来实现,或者说Web Service符合SCA规范么.
    而且对于SOA来说,连接不同的服务常常使用ESB,在SCA规范里面也可以么.
    谢谢LZ啊
    2007-10-12 20:41:19作者回复
    A:那么SCA用什么技术来实现,或者说Web Service符合SCA规范么.<br />Q:这两个好象不是一个问题 :) <br />SCA的实现目前有三种类型:Java、C++和PHP 。更多信息,请访问OSOA官方网站 http://www.osoa.org/<br />SCA规范中规定了Service和Reference的Binding可以使用Web Service、SCA、JCA、JMS等技术。就是说通过SCA可以使用标准的Web Service。<br />Binding是Service和Reference元素的子元素,在每个Service和Reference中可以包含0个或者多个Binding。Binding描述了一个访问机制,即由哪种类型的技术来提供服务功能。对Service来说是向外提供,对Reference来说是向里引入。<br /><br />A:而且对于SOA来说,连接不同的服务常常使用ESB,在SCA规范里面也可以么.<br />Q:可以。如果SCA模型适当,可以当作ESB来用。比如,可以把多个Web Service用Component封装在一个Composite中,通过Composite对外发布所有的Web Service的接口。把一个Composite当作ESB来用。<br /><br />
    #AA 发表于2007-10-10 15:38:59  IP: 59.64.12.*
    或者说SCA的实现技术有哪些
    通过什么样的方式达到粗粒度 松耦合的目标呢
    对于J2EE和.NET还好,那对于那种以前那种C/S架构的EIS
    怎么能够包装成符合SCA规范的服务呢
    很困惑,看过好多的资料
    基本都停留在理论阶段 没见付于实际的
    是不是现在谈论SCA只是停留在理论阶段呢
    因为我们根本不能把以前那些系统拆分为一个个服务
    然后像搭积木一样组合成一个个引用
    不能解决服务拆分的问题
    就无法谈集成的问题 也就谈不上解决"信息孤岛"的问题了
    对不起啊,一下说这么多
    希望LZ 帮我解答下 非常感谢
    感觉掉里面出不来的感觉
    要是不方便发我邮箱也可以:
    05121137@bjtu.edu.cn
    2007-10-12 21:39:26作者回复
    1、就C/S架够的EIS说几点看法。<br />首先,要提出几个问题。C/S模式EIS需不需要用SCA改造?改造的主要目的是什么?是尝试这种开发模式、目前的功能无法满足需要,还是系统功增加量很大并且修改频繁?它的使用寿命还有多长?会不会在短期内被其他的新产品,新版本替代?适合不适合采用SCA这种结构?采用SCA结构改造与不使用SCA改造相比,增加的开发成本、人力成本、学习成本、系统性能、使用效率、维护成本、可能的风险是不是在可以接受的范围内?如果确定可以采用SCA来改造,那么还要根据系统的实际情况来判断采用那种方法更合适。<br /><br />2、因为我们根本不能把以前那些系统拆分为一个个服务,然后像搭积木一样组合成一个个引用,不能解决服务拆分的问题,就无法谈集成的问题 也就谈不上解决"信息孤岛"的问题了<br /><br />使用SCA并不一定非要把以前的系统拆份成一个个的服务,然后利用Component引入SCA系统。SCA是一个非常非常灵活的架构,除了作为一个系统的总体架构之外,它还可以作为嵌入式架构与原有的系统进行协同工作。它本身有清晰的实现层、架构层(可以认为是逻辑层)和业务层,更重要的是它可以通过这三层灵活的组织成为任何一个系统的实现层、逻辑层和业务层的一部分!只有这样才能充分发挥SCA的作用,而不是仅仅作为一个新系统的主框架。因为SCA更多的是面对遗留系统提供解决方案的。当然,这些还是基于理论的,需要用实践来检验。<br /><br />第一段提到的方法,就是如何将SCA架构嵌入以前的系统环境中与以前的系统协同工作的方式。具体的嵌入方式还要依据实际系统的情况考虑,系统的性能和耦合程度是非常重要的指标。<br /><br />个人观点,仅供参考。
    2007-10-12 21:47:59作者回复
    听说,IBM在用SCA对原有的系统进行功能流程化集成,这也是利用SCA在遗留系统中进行系统改造的一个实践吧.
    #AA 发表于2007-10-13 12:17:11  IP: 59.65.163.*
    "如果SCA模型适当,可以当作ESB来用。比如,可以把多个Web Service用Component封装在一个Composite中,通过Composite对外发布所有的Web Service的接口。把一个Composite当作ESB来用。"
    对这句话,我有疑问.
    (1).照这么说,在SCA架构中没有ESB,而让Composite来充当ESB的功能.这样显然是不合适的,因为Composite根本不能来担当ESB的功能.ESB 充当服务使用者和服务提供者之间的中间层,允许在不受协议限制的前提下连接任何使用者和提供者。要担当路由,服务交互,通信,安全等各方面的功能.而且现在有各种比较成熟的产品.
    (2)如果在在SCA架构中没有ESB,那么用什么把各个服务连接在一块,如何实现服务的集成.

    ----------------------------------------------------------

    (3)在SCA中提供服务的是Composite么,普元就翻译成"业务构件".还有,如果在SCA中提供服务的是Composite,那么Composite作为一个服务与Web Service有什么不同呢?Composite如何发布为Web Service.

    (4)我们在Tuscany开源框架中,它提供的实现类型比SCA规范要多很多,那么Tuscany实现的还是否符合SCA规范.

    #jackyrong 发表于2007-10-14 12:49:59  IP: 121.32.155.*
    hi,王老师,因为我在搞在职硕士毕业论文,也是搞SOA的,我现在
    想搞SCA和BPEL的结合,但有个问题的是,如何针对我目前的系统
    (比如SPRING的),将其改造成SCA呢?我觉得SPRING和SCA的模式都很相似。还有的就是。我想把SCA和BPEL结合起来
    ,改造目前的遗留系统,但不知道如何入手比较好,我根据目前的一些资料,初步的有个想法是,做一个DEMO,比如
    做一个系统,用户注册登陆后,通过BPEL调用一个流程,首先调用的是验证身份的WEB服务,验证会员登级后,则再通过BPEL调用一个购物流程,将购物请求异步发送到两个合作伙伴,然后将价格低的返回给用户。
    但在上面的过程中,我只感觉到可以用上BPEL,但好象用不到SCA吧?如何能用上SCA呢?
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © teamlet