《电子技术应用》
您所在的位置:首页 > 通信与网络 > 设计应用 > 基于XML和工作流的构件化软件框架研究
基于XML和工作流的构件化软件框架研究
来源:电子技术应用2011年第4期
房 莉,陈湘平,程 敏,涂文婕
空军雷达学院 预警监视情报系,湖北 武汉430019
摘要: 基于XML技术,采用构件化设计方式,搭建了构件组装和运行框架,并研究了基于工作流控制方式的构件动态调度策略。用户可以在构件组装框架下集成应用系统,并实现相应的业务功能。
中图分类号: TP311.5
文献标识码: A
文章编号: 0258-7998(2011)04-0040-05
Research on frame of component-based software based on workflow and XML
Fang Li,Chen Xiangping,Cheng Min,Tu Wenjie
Department of Early Warning Surveillance Intelligence, Air Force Radar Academy, Wuhan 430019,China
Abstract: This paper built an assembling frame and a running frame for components based on XML, and studied components dynamic scheduling method. Application system can be assembled under the component assembling frame and then run under the running frame. The frame implemented components assembling like receptacle, and components can be assembled to sub modules, and then to function modules, and then to application system.
Key words : XML;workflow;component;interface testing


    现有的软件系统多采用传统开发方法且只针对某个具体应用开发,软件与设备及软件内部各模块间耦合紧密,软件可复用性低、可扩展性差。
    基于构件的软件开发方法[1],其思想是使软件能够像硬件那样,通过各部分的动态组装完成整个应用系统的功能。基于构件的软件工程CBSE(Component Based Software Engineering)逐渐成为软件开发的主流模式[2],已成为近几年学术界和产业界共同关注和研究的热点。
1 构件模型
    相对于传统对象而言,构件将抽象程度提到一个更高的层次,整个构件隐藏了具体的实现,只用接口提供服务。这样,构件可以将底层的多个逻辑组合成高层次上的粒度更大的新构件,甚至直接封装到一个系统中,使模块的重用从代码级、对象级、架构级到系统级都可能实现[3-5]。
1.1 构件模型
    为了在后期使用构件时能够快速检索到需要的构件,必须对构件进行分类。构件可以使用多种分类方法。本系统先将构件分为原子构件Ca和复合构件Cc两大类,原子构件是不能再分的构件,复合构件是由原子构件或复合构件组成的构件。
    原子构件可表示为Ca=(IDa,Na,Ta,Ia,Oa,Ma,Da),其中,IDa为原子构件唯一标识;Na为原子构件名称;Ta为原子构件类型集合(包括子类型集合),父类型和子类型用树形结构表示;Ia为原子构件输入接口集合(包括各接口的名称、参数、参数类型);Oa为原子构件输出接口集合(包括各接口的名称、参数、参数类型);Ma为原子构件消息集合;Da为原子构件描述信息(包括构件存储路径、索引关键字、功能描述、编写语言、作者、制作日期、版本)。
    复合构件可表示为Cc=(IDc,Nc,Tc,Ic,Oc,Mc,Dc,IDas,Ras),其中,IDc为复合构件唯一标识;Nc为复合构件名称;Tc为复合构件类型集合(包括子类型集合),父类型和子类用树形结构表示;Ic为复合构件输入接口指针集合,该指针指向组成复合构件的原子构件对应输入接口;Oc为复合构件输出接口指针集合,该指针指向组成复合构件的原子构件对应输出接口;Mc为复合构件消息集合;Dc为复合构件描述信息(包括构件存储路径、索引关键字、功能描述、编写语言、作者、制作日期、版本);IDas为组成复合构件的原子构件IDa集合;Ras为组成复合构件的原子构件的连接关系。
    原子构件和复合构件又可以根据功能划分为界面构件、通信构件、数据库构件、业务构件等。其中,每一类构件又可细分为很多子类。构件粒度越小,复用度越高,构件耦合度越低,但构件库中构件的数量也会随着粒度的变小而剧增,这会给构件的检索带来不便。因此,应根据具体需求,把握好构件的粒度。可参考式(1)[6]:
 
1.2 基于构件的软件开发过程
    面向构件的软件开发过程如图1所示。具体描述如下:

    (1)总体设计者对业务系统进行需求分析后得到功能需求和框架需求。
    (2)构件分析者根据功能需求进行构件需求分析后得到构件需求;同时框架实现者根据框架需求对系统框架进行实现。
    (3)构件实现者根据构件需求对构件进行实现,并经过严格测试和修改后得到合格的构件。
    (4)构件库管理者可以将新制作的构件注册入库,为了能快速检索到构件,构件入库时必须对其信息进行精确全面的描述。本文使用XML描述构件信息,并使用XML Schema对构件描述文档进行合法性检验,只有描述合法的构件才可以入库,从而确保构件描述信息的一致性和完整性。构件库管理者可以对构件库中的构件进行删除、注销、检索等操作。
    (5)构件组装者根据具体需要从构件库中检索需要的构件,并在系统框架下进行组装后形成应用系统,构件组装者还负责对应用系统的测试与维护。
    (6)应用系统交付用户使用并提出修改意见与建议,构件组装者再根据用户需求进行修改。
2 基于构件的软件框架
    面向构件的软件开发过程中,构件组装和运行需要特殊的环境,这种特殊的运行环境称为框架。一个框架由一些规则、建议和习惯组成,它们从构件的角度定义了一个系统结构,并定义了系统的各组成部分之间是如何通信和实现互操作的。因此,设计框架时,必须自己定义构件及框架的规范,使用者只有遵循这些规范,才能将构件集成到框架中。本系统框架包括构件组装框架和构件运行框架两部分,这两个框架由系统框架管理器管理,以确保系统在某一时刻,只能处于其中一个框架下。系统处于构件组装框架时,可实现构件组装、功能模块组装、应用系统集成、应用系统修改、应用系统功能扩展等功能。系统处于运行框架时,能够完成相应的业务处理功能,但不能对其进行配置。基于构件的软件框架结构如图2所示。
2.1 构件组装框架
     传统的构件组装大多使用代码方式调用构件接口,此方式比较复杂。本框架提供一种图形化的构件组装界面,开发者可以轻松高效地集成新的应用系统或对已有系统进行扩展。
    如图2所示,构件组装框架主要包括构件制作工具、构件测试工具、构件库管理工具、构件组装工具、模块管理工具、模块组装工具。其中,制作工具、构件测试工具只提供简单的构件制作和测试功能,构件实现者可以选择市场上其他工具进行构件制作及测试;构件库管理工具具有构件注册、注销、删除、检索等功能,模块管理工具具有模块注册、修改、删除、检索等功能,这两个工具实现起来相对简单;构件组装和模块组装时生成对应的XML配置文档,通过这些XML配置文档将构件粘合成应用系统。本文使用的XML配置文档主要包括:(1)构件描述文档:对构件信息进行描述,以便使用构件时能方便获取构件信息;(2)构件适配文档:对构件接口连接关系进行描述;(3)模块适配文档:对模块之间以及构件和模块之间连接关系的描述;(4)菜单适配文档:将菜单与对应业务模块绑定,以便用户点击对应的菜单时,触发该功能模块运行。组装时,通过这些XML配置文档,将构件组装成子模块、功能模块直至整个综合测试系统,需要时查找模型中相应的标签位置并灵活插入,这样在对系统修改时,只需要修改相应的构件,其他部分不受影响。此方法支持系统的快速开发和修改,具有较高的灵活性和较好的可扩展性,达到了令人满意的伸缩性。


    在组装时,构件组装者根据应用系统的需求检索相关构件,如果构件库中无此构件,则必须制作相关构件并放入构件库中,再将检索到的构件通过构件组装工具进行组装。为了不使应用系统在组装过程中太复杂,先将构件组装成业务构件,再将业务构件组装成功能模块,最后将功能模块组装成应用系统。
2.1.1 构件组装
    构件组装工具的核心是解决构件适配问题。大多数情况下,使用不同语言制作的构件都需要做某种方式的修改以便与其他构件相匹配,这个过程称为构件适配,适配方法有白盒法、黑盒法和灰盒法。文献[7]对三种方法的技术、特点和实现的难易程度进行了分析,结论是采用灰盒法既可以实现构件组装的灵活性,又不至于使适配技术过于复杂。本文在对各种灰盒法的适配技术进行比较后,采用基于连接器的适配技术。此方法将构件功能的实现与其交互作用的实现相分离,从而增加构件组装的可配置性,在现有技术条件下,它是实现构件动态组装的有效途径之一。
    构件连接器可以表示为CL=(IDcl,Ncl,Rcls),其中,IDcl为连接器唯一标识;Ncl为连接器名称;Rcls为连接关系集合,包含有多个接口连接关系,每个连接关系Rcl可表示为Rcl=(IDsc,IDdc,DTc,Dc,MSc),其中,IDsc表示源构件唯一标识,IDdc表示目标构件唯一标识,DTc表示数据类型,Dc为数据的值,MSc表示消息。
2.1.2 模块组装
    通过模块组装工具可以将业务模块组装成功能模块。本文使用类似连接器的方法设计模块连接器。
    模块连接器可以表示为:ML=(IDml,Nml,Rmls),其中,IDml为模块连接器唯一标识;Nml为模块连接器名称;Rmls为连接关系集合,包含有多个模块接口连接关系,每个连接关系Rml可表示为Rml=(IDsm,IDdm,DTm,Dm,MSm),其中,IDsm表示源模块唯一标识,IDdm表示目标模块唯一标识,DTm表示数据类型,Dm为数据的值,MSm表示消息。
    模块连接器信息用XML适配文档进行描述,其XML schema源码如下:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XML
Schema">
<xsd:element name=" IDml " type="xsd:string"/>
<xsd:element name=" Nml ">
<xsd:complexType>
<xsd:sequence maxOccurs="unbounded">
   <xsd:element name="Rml"type="xsd:string" maxOccurs=
"unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
2.1.3 菜单配置
    菜单描述工具的主要功能是将菜单与对应功能的模块进行绑定,生成菜单适配文档。本系统菜单嵌套最多为三级,菜单适配文档可表示为FL=(IDm,IDf1,IDf2,IDf3),其中IDm表示功能模块ID,IDfi为第i级菜单ID,i=1,2,3。其源码可参考前文给出的模块适配文档XML schema源码。
2.2 构件运行框架
    构件运行框架主要包括:构件调度器、构件实例化工具以及各种XML配置文档解析器。其中,配置文档解析器的功能是解析对应的XML配置文档,其实现相对简单,在此不作介绍。下面重点介绍构件调度器和构件实例化工具。
2.2.1 基于工作流控制的构件调度模型
    构件调度是一个动态过程,调度之前难以知道构件运行所需要的全部信息,因此很难一次性建立构件调度模型。即使建立了模型,随着构件调度的执行,各种因素发生变化,也会使模型不能反应信息的动态变化而导致构件调度失败。
    工作流技术[7,8]最初被广泛应用于解决企业的项目调度问题,现已逐渐扩展到许多领域。工作流技术可以全面描述过程的信息,在运行时能够动态监视业务过程的执行情况,因此可得到过程执行的实时信息,如:过程执行、资源利用、时间计划情况等,并能根据这些信息生成新的调度方案。因此,工作流技术可以应用于解决构件调度问题。
    本文提出一种基于工作流技术的构件调度模型,模块包括:过程控制模型、公共资源服务模型、消息处理模型、工作流数据模型。各模型之间的调用关系如图3所示。

    过程控制模型是构件调度模型的核心和骨架,定义应用系统所有构件的处理流程,描述构件调度问题的约束,包括模块之间以及组成模块的构件之间的逻辑关系、详细描述(执行所需的信息、资源)等。这些信息可以在构件调度过程中通过各种XML配置文档解析器解析对应的XML配置文档获取。利用这些信息可以预测并找出工作流所管理的全部过程实例之间存在的资源冲突情况。通过把产生资源冲突的过程实例按照一定的规则抽取出来就可以得到项目调度的动态模型。由于过程实例的执行情况不断变化,如某些过程实例执行结束、某些实例被终止、某些活动被挂起、某些异常出现等,因此按照一定的周期动态地从这些过程实例中所得到的过程模型也会随之不断更新,得到&ldquo;最新&rdquo;的调度模型,这解决了调度模型不能反映信息动态变化的问题。
    公共资源服务模型定义构件调度过程中需要的公共服务资源,如数据库服务、打印服务等。
    消息处理模型定义构件调度过程中的事件属性,它是一个构件向另一个构件发出的某种通知。
    工作流数据模型定义了与构件调度模型执行密切相关的数据。从某种意义上讲,它确定构件执行过程状态转换的条件。
2.2.2 构件实例化
    构件是动态调用的,即应用系统运行前构件都没有实例化,只有在执行过程中调用时才实例化。可以借助反射机制实现构件动态实例化。本文的构件实例化工具是在.NET平台下用C#语言实现,其关键代码如下:
private void CreateInstanceAndInvoke()
{
    ParseXML();//解析相关XML文档
    SourceComXMLPath=COMSchedule();//构件调度器
    Assembly curAssm=Assembly.LoadFile(SourceComXMLPath);
    Type[] types=curAssm.GetTypes();
    if (isInterface)
    {
        foreach (Type type in types)
        {
            MethodInfo[] methodInfos=type.GetMethods();
            foreach (MethodInfo methodInfo in methodInfos)
            {
                ParameterInfo[] paras=
methodInfo.GetParameters();
                object[] objSourceParas=
new object[paras.Length];
                object[] objTargetParas;
                if (methodInfo.Name==strSourceComInter-
faceName)
                {
objTargetParas=methodInfo.Invoke(curAssm.CreateInstance
(type.FullName),
out objSourceParas);
                    InvokeTarget();//调用目标构件的接口
                }
            }
        }
    }
    else
    {
        &hellip;&hellip;
    }
    &hellip;
}
3 应用实例
    本文设计的基于工作流控制的构件化软件框架已经在某型设备接口测试系统中得到应用。某型设备有多种待测接口,下面以其A/D接口测试为例说明本系统的有效性。
    图4为对某型设备A/D、D/A接口构件划分结果图。构件通过构件连接器组装成业务模块,业务模块通过模块连接器组装成功能模块。组装后的某型设备接口测试系统对A/D接口测试结果如图5所示。测试中,A/D接口的通道13测试误差大于设定误差的最大值,未通过测试;其他接口各通道的测试误差均小于其最大误差要求,通过测试。

    实践应用证明,该软件框架可以实现基于构件的应用系统的插座式组装,使其能从原子构件集成子模块、功能模块直至整个应用系统。此方法支持系统的快速开发和修改,具有较高的灵活性和较好的可扩展性,达到了令人满意的伸缩性。
    针对目前大多数软件模块间耦合紧密、软件可复用性低、可扩展性差等问题。将XML、工作流和构件技术相结合,设计了图形化方式构件组装框架和构件运行框架。用户可以在构件组装框架下集成应用系统,在构件运行框架下运行组装的系统可以实现相应的业务功能。实践证明,该软件框架可以实现基于构件的应用系统的插座式组装,使其能从原子构件集成子模块、功能模块直至整个应用系统。此方法支持系统的快速开发和修改,具有较高的灵活性和较好的可扩展性,避免了软件的重复开发,节省了大量费用,达到了令人满意的伸缩性效果。
参考文献
[1] 杨芙清,王千祥,梅宏,等.基于复用的软件生产技术[J].中国科学,2001,31(4):363-371.
[2] 任洪敏,钱乐秋.构件组装及其形式化推导研究[JJ.软件学报,2003,l4(6):1066-1074.
[3] 王强,何克清,李兵,等.基于MMF的互操作性软构件库管理模型的研究[J].计算机工程,2005,31(16):57-58.
[4] 吴信永,宋东,刘飞.基于构件技术的通用ATS框架设计[J].计算机测量与控制,2008,16(2):141-143.
[5] 王忠杰,徐晓飞,战德臣.基于特征的构件模型及其规范化设计过程[J].软件学报,2006,17(1):39-47.
[6] 徐玮,保林,李昭原.企业信息系统业务构件研究[J]. 软件学报,2003,14(7):1213-1220.
[7] 王志坚,费玉奎,娄渊清.软件构件技术及其应用[M]. 北京:科学出版社,2005.
[8] 李伟平,范玉顺.基于工作流的资源受限项目调度研 究[J].清华大学学报(自然科学版),2004,44(10):
1384-138.

此内容为AET网站原创,未经授权禁止转载。