分布式构件库

2024-06-19

分布式构件库(共6篇)

分布式构件库 篇1

0 引 言

基于构件的软件开发 (CBSD) 能有效地提高软件的开发效率, 提高软件的质量, 降低开发和维护成本, 因此成为当今软件工程界研究的热点之一。其中构件库是CBSD的核心技术之一。

为了支持CBSD, 一些企业建立了自己的构件库, 一些机构 (如上海软件构件化服务中心) 也建立了集中式构件库 (如上海构件库) 。构件库呈现出局部集中、总体分散、异构等特点[1]。以上海市的构件应用情况来看, 各个企业构件库所拥有的构件数目之和远远多于上海构件库拥有的数目, 由于知识产权和商业运作等原因, 难以将各企业的构件集中存放到上海构件库。这种局面给构件的复用带来以下问题:1) 构件的请求者不知道谁有他所需的构件, 同样, 构件的提供者不知道谁需要他所拥有的构件;2) 每个企业构件库的分类描述方案不同, 互相之间无法理解, 呈现出异构性。

本文利用Agent的主动性、协作性、反应性等特征[2], 提出一个基于多Agent的分布式构件库系统方案, 能较好地解决上述提出的构件复用问题。

1 解决方案

本文构造分布式构件库系统的基本思路是:在保持原有企业构件库物理分布和实现机制不变的基础上, 在系统的每个拥有企业构件库的节点上部署多个Agent:发布Agent、检索Agent和请求Agent, 这些Agent通过公共的由发布区、检索区和反馈区组成的电子公告牌和自身的自主动作相互协作, 联合完成用户的构件检索请求。

在分布式构件库系统中, 每个企业都可以将自己愿意提供的构件, 通过发布Agent发送至公告牌的发布区。当一个企业需要一个本企业没有的构件时, 可通过请求Agent从发布区寻找所需的构件或将检索请求发至公告牌的检索区。每个企业可通过检索Agent自主地到检索区获取别的企业的检索请求, 然后在本地的构件库中进行检索, 并将检索到的构件发布到反馈区。发出检索请求的企业可通过请求Agent在反馈区中获取所请求的构件。这种多Agent通过公告牌进行协作的方式可解决引言中提出的第1个构件复用问题。然而, 各个企业构件库的分类描述方案通常是不同的, 即构件库是异构的。刻面描述因为能够表达丰富的构件信息、方便的管理和查询, 因此被目前大多数企业的构件库采用[3,8], 其异构性主要表现在刻面描述方案的不同。为此我们把上海构件库的刻面描述方案作为基准描述方案, 然后, 在每个Agent的内部设置一个构件描述转换器, 实现企业构件描述方案和上海构件库刻面描述方案之间的自动双向转换, 以此来解决构件库之间的异构问题。

2 分布式构件库系统的体系结构

分布式构件库系统由物理上分布的多个企业构件库系统组成, 图1是本文提出的分布式构件库系统的体系结构。分布在不同地域的企业构件库系统构成分布式构件库系统, 上海构件库系统作为这个分布式构件库系统在逻辑上的集中式入口。

图1中的每一个Agent自主、灵活地完成自己的功能。各Agent之间使用黑板方式进行通信, 采用直接/主动非中止合作模型[4]。电子公告牌的发布区存放每个企业允许对外公开的构件信息, 请求区存放每个企业向外的构件检索请求信息, 反馈区存放每个企业检索后返回给请求者的构件信息。每个Agent在将相关信息 (发布信息、请求信息、反馈结果) 从企业发送至公告牌时, 都需要通过构件描述转换器先将这些信息转换成上海构件库的刻面描述;同样这些Agent从公告牌获取相关信息后, 也需要通过构件描述转换器将这些信息转换成本地的刻面描述。

下面我们来分析各Agent自主地相互协作以实现跨库检索的过程, 对于企业B来说, 请求并检索到期望构件的途径有下面两条:

(1) 企业A的发布Agent主动发布构件描述信息到发布区, 企业B的请求Agent在发布区中获取到期望的构件。

(2) 企业B的请求Agent发送期望的构件请求信息到请求区, 企业A的检索Agent从请求区获取该请求, 然后从自己企业的构件库中检索构件, 并把检索到的构件信息发送到反馈区, 企业B的请求Agent在反馈区中获得期望的构件。

在分布式构件库系统中, 拥有构件的一方 (如企业A) 既可以通过途径 (1) 把自己的构件信息公布给其他企业, 也可以通过途径 (2) 把自己的构件交易给特定的合作伙伴, 具有很大的灵活性, 保护了每个企业的知识产权。另外, Agent的安装只是在企业构件库系统外部加了一层和上海软件构件化服务中心交互的代理主体, 完全不影响企业内部本来的运转, 也不需要企业内部做出任何改变, 使得企业之间交流构件的成本非常低廉。

图1中的企业构件库的完整结构如图2所示。构件库内存放实际的构件和相关信息, 构件库管理系统负责对它的管理和维护。在企业开发应用系统的过程中, 首先在本企业的构件库中查找所需的构件。如果在本企业构件库中没有找到合适的构件, 就通过Agent请求其他企业的构件。因此企业在复用构件时, 将检索构件的范围扩大到整个分布式构件库。

通过以上的分析, 我们得出分布式构件库系统具备以下功能:

(1) 能实现异构构件库之间的互联和检索;

(2) 解决了请求者和提供者之间的双盲“连接”。

从而较好地解决了跨库检索的需求, 而且具有松耦合、灵活性高等特点。

3 结束语

为了提高构件的检索范围和复用率, 不同的企业间需要共享对方的构件资产, 从而产生了跨越构件库检索构件的需求[5]。本文在分析了已有构件库及其使用现状的基础上, 利用Agent的主动性等特征[6,7], 提出了一个基于Agent的分布式构件库系统, 以满足高效率复用构件资产的需求。本研究对于CBSD具有重要的理论意义及实用价值。

本课题来源于上海构件库的相关项目, 作者已经完成了该项目, 并且已经通过了上海软件构件化服务中心的最终测试。

参考文献

[1]薛云皎.基于智能主体的分布式构件库相关技术研究[D].复旦大学, 2006.

[2]Michael Wooldridge.多Agent系统引论[M].石纯一, 等译.北京:电子工业出版社, 2003.

[3]王渊峰, 薛云皎, 张涌, 等.刻面分类构件的匹配模型[J].软件学报, 2003, 14 (3) .

[4]毛新军.面向主体的软件开发[M].北京:清华大学出版社, 2005.

[5]薛云皎, 钱乐秋, 彭鑫, 等.智能主体在构件检索中的知识处理研究[J].计算机工程与应用, 2006, 42 (8) .

[6]Shaw N G, Mian A, Yadav S B.A Comprehensive Agent-based Archi-tecture for Intelligent Information Retrieval in A Distributed Heteroge-neous Environment[J].Decision Support Systems, 2002, 32 (4) .

[7]于万霞, 张维存.基于Agent的高校综合实验室管理系统[J].计算机与现代化, 2006 (1) .

[8]常继传, 李克勤, 郭立峰, 等.青鸟系统中可复用软件构件的表示与查询[J].电子学报, 2000, 28 (8) :20-24.

分布式构件库 篇2

关键词:软构件检索,概念分析,基于执行检索,概念网格

1 引言

基于构件的软件开发具有降低软件成本、提高软件质量和编程效率等优点,而且基于构件的系统更可靠,开发周期更短。但是基于构件的软件开发面临的一个技术问题是构件库对具有可重用价值构件提供的检索能力不足,高效的检索使用户能够快速定位到所需要的构件,从而满足用户的需要。因此,构件的检索技术是该领域研究的一个关键问题。

目前的构件表示和检索方法有很多,从构件表示出发可以分为人工智能方法、超文本方法和信息科学方法三类;而根据复杂度和检索效果的不同则可以分为基于文本的、基于词法描述子的和基于规约的编码和检索[1,2]。

2 面向特定领域的软件构件库

面向特定领域的构件库能将软件范围限制在单个领域内,使得软件构件易于理解特定领域内的软件类别比较单一,构件的应用就只限于单一的特定领域;同时领域内刻面的划分比较固定,不必考虑刻面的可扩展性;特定领域的刻画分类尽量使用本领域的专业词汇,就很大程度消除了同义词出现的几率,进一步提高检索的准确率。但是随着构件库中构件数量的增加,使用者在检索和提取构件时仍会遇到困难,构件库管理员在对构件进行管理和维护时也会显得力不从心。其原因主要有以下几点:

I).用户检索构件时,可能有多个满足条件的构件,如何快速,准确地从中判断并选取所需的构件很大程度上取决于用户的复用经验及对构件的理解和主观评判[3]。

2)通常用户通过刻面、属性、关键词、关系等表达所需构件的特征以进行构件的检索。然而访问构件库的用户具有不同的层次,对刻面的理解会有差异,从而导致无法准确检索,造成同义词的过多使用,影响查询速度。

3).构件库中的代码构件如果单纯依靠刻面来检索,查准率不高,要想高效的检索可执行的构件,最好的办法就是实际执行每个代码构件。

由上可知,刻面分类很大程度上依赖于主观因素,因此考虑在实际面向特定领域的软件构件库(主要针对代码构件)检索过程中采用基于概念分析的检索方法,降低刻面值的主观因素,增加构件检索的客观性,从而提高检索速度和检索效率。

代码构件有一个与其他构件不同的特征就是:它们可以被执行,检索精确构件的办法就是实际执行每个代码构件,用样本输入作为构件的输入,将构件的输出与用户需要的输出比较,才能准确了解构件的输入、输出和具体的运行环境,方便用户确定该构件是否满足用户需求。但是这样的执行过程往往花费过多时间,而且在实际操作过程中很难控制执行过程的终止。Park提出了一种方法来实现更高效的检索[4]:首先将构件库中现存的软件构件组织在一起,其依据是,给构件相同的样本输入,得到的结果保存在构件库中作为软件构件的一个特征。在这个软件构件的检索过程中,可以使用概念分析来进行检索。

3 基于概念分析的检索机制

3.1 概念分析的检索机制简介

概念分析总体来看,是在软件工程领域包括软件构件检索,构造空间分析和继承代码的模块化的一种新的框架。概念分析的检索机制具体实现方法为:使用样本方法实现虚拟的可知性文件(代码)的检索。执行代码构件用样本输入观察输出是否与给定的输出描述一致。将构件库执行以后的输出和样本输入都保存起来,当以后检索时,只需要检索样本输入和输出即可,不需要实际的执行过程(输入样本不只是由用户给出的,也不是由功能构件的讨论域随机提供的,样本输入取决于保存构件的顺序)。随后,使用一种用关键词作索引的方法来检索构件,即概念分析用于构件库软件构件的检索。用户检索构件时先从构件库中选择构件的样本输入,而这些样本是库中可用的,从动态创建的样本列表中得到的。这种方法类似于基于执行的检索,却不需要真正的执行过程,避免了没有终止和过长的执行时间,从而提高了检索效率。

3.2 用样本表示构件

定义:如果构件C对样本输入有样本输出,则称样本S对构件C是有效的。如果构件是函数,样本由参数值和返回值构成;如果代码构件是程序(具有副作用的函数),样本由参数值、返回值和执行后的参数值组成。

例如,假设构件库L中包含下列5种字符串处理函数构件:

scopy(str1,str2)将字符串str2的内容拷贝到字符串str1。

sswap(strl,str2)将字符串str1和str2的内容互换。

srmv(str1,str2):从字符串str1中删除str2.

strim(str1,str2):从字符串str1的开头和结尾裁掉字符串str2的内容。

sconcat(str1,str2):将字符串str2连接到字符串strl的末尾。

表1中列出了样本描述的函数,每个样本由执行前的参数和执行后的参数和返回值构成。这里的样本集由构件的开发人员提供(因为开发人员对构件执行的功能非常熟悉,可以提供能够准确反映构件的样本),用户可以选择现存的样本来检索需要的构件。

正式文本定义为[4,5,6]:一个称为对象的元素的有限集O,元素的有限集A称为属性,R是对象和属性间的有序对集。即,O和A之间的一一对应关系。一个三元组(O,A,R)称为正式文本。

C是构件库中所有构件的集合:

S是构件库中描述构件的所有样本集合:

基于集合C×S,我们定义了一个二维关系R,这个关系是对构件有效的样本集合:

这样表示构件库的三元组(C,S,R)就构成了一个正式文本。

3.3 构件概念网格

示例构件库L的三元组(C,S,r)就构成了一个正式文本,其中

基于样本输入-输出对和构件之间的关系,我们使用概念分析构造一个网格结构的重用构件库L,对给定的文本构建概念网格需要若干算法。正式概念分析可以概括如下[4,5,6]集合S1和T1满足下列关系:S1是O的子集,T1是A的子集;T1是S1中对象的公共属性集合;S1是T1中属性的公共对象集合。则(S1,T1)称为正式概念。S1,T1分别称为概念(S1,T1)的范围和内容。两个概念的最大下界(V)表示二者内容的交集,以及结果的公共对象。

(S1,T1)∨(S2,T2)=({O|for all a∈T1∩T2,(o,a)∈R&o∈O},T1∩T2)

例如,从样本构件库L得到的文本(C,S,r)的包含的概念包括如下:

概念网格可以使用简化的标签来描述网格图的简单形式,其中,每个对象和属性只需要键入一次即可。如果一个概念是包含a的最大概念,则这个概念标上属性a。即,标有属性a的概念下面的所有概念中都包含了属性a。类似的,如果一个概念标上对象o则它是包含o的最小的概念。

例如,图1描述的示例构件库L的概念网格图。

3.4 基于概念网格检索构件

首先检索系统将提供构件库的所有可用的样本清单,然后用户从中选择需要构件有效的样本。当用户在某一个基点选择样本时,检索系统动态提供基点之上可用的(上下文相关的)样本清单。这种检索比基于刻面的检索更加灵活,因为这种检索机制不需要完全的、确定的样本序列。

假设给出的构件库L中,检索系统最初将s1,s2,s3,s4,s5,s6,s7,s8,s9和s10作为可用的样本。如果用户选择s10,则可用的样本就是s2,s3,s4,s6和s7,这就意味着在构件库中没有同时包含s10和s1,s5,s8,s9中任意一个作为有效样本的构件。当用户进一步选择s3时,s4就称为从那个点开始唯一的可用样本。

如果用户正在搜索一个构件,并把Q作为选择的样本s1,s2……sk,则检索步骤如下:

第一步:找到所有标有属性s1,s2……sk的概念;

第二步:找到所有概念的最大下界;

第三步:检索所有的构件,如,最大下界的对象集。所有被检索过的构件将选择的构件s1,s2……sk作为有效样本。

如果概念的对象集为空,则我们可以得到结论:构件库中没有构件满足这个查询。例如,如果用户的查询Q1={S10}。则系统找到标记了s10的概念X8,并且检索到构件srmv,strim和sconcat。注意到s10是上面构件的有效样本。如果查询Q2={sl0,s4},系统找到概念X5,因为它是标记了s10的概念X8和标记了s4的概念X7的最大下界。所以就可以找到构件sconcat。如果用户选择了s10和s1作为查询Q3,标记了s10的概念X8和标记了s1的概念X6的最大下界是底层概念(Bottom),那么系统就没有检索到任何构件,即构件库L中没有任何同时将s10和s4作为有效样本的构件。

当有新构件保存到构件库时,构件库的构件网格就重构。现存的构件将从构件库中移走或修改现存构件的样本,这样就实现了更新概念网格。

4 结论

面向特定领域的软件构件库主要针对可执行代码进行检索,本文提出的基于概念分析的代码构件检索具体实现方法为:使用样本方法实现虚拟的可执行文件的检索。执行代码构件用样本输入观察输出是否与给定的输出描述一致。将构件执行以后的输出和样本输入都保存起来,当以后检索时,只需要检索样本输入和输出即可,不需要实际的执行过程。随后,使用关键词做索引的方法来检索构件。使用基于概念的代码构件检索方法克服了刻面检索主观性过多而导致的检索低效行问题,从而能更好的应用于大型的面向特定领域的主要构件为代码构件的软构件库。这种方法也可以直接应用于除代码构建之外的其他软件构件,只要构件可以被描述为输入一输出的二维关系即可。

参考文献

[1]FrakesW B,Pole T P.An emp irical study of rep pesentation methods for reusable sof tware components [J].IEEE Trans2 actions on Software Engineering.1994,20 (8):617-630.

[2]Mill H,Rada R,W ang W,et al.Practitioner and Sof tC lass:a comparative study of two sof tware reuse research projects[J].Systems and Software.1994,27 (5):147-170.

[3]王渊峰,张涌,任宏敏,等.基于刻面描述的构件检索.软件学报[J],2002,13(8):1546-1551.

[4]Ganter B.,Wille R,.,1996.Applied Lattice Theory:Formal Concept Analysis,http://www. math.tudresden.det/_ganCer/fca.html

[5]Wille R,.,1982 .Restructuring lattice theory: an approach based on hierarchies of concepts.In: Rival,1.(Ed.),Ordered Sets,445-465.

基于构件库的柔性电能结算方法 篇3

国内的电力交易以中长期为主,近年来随着国家节能减排的政策引导、跨区域特高压建设的发展,发电权交易及跨区、跨省外送电交易越发活跃[1],交易品种与交易方式不断变化。电力交易的结算,作为交易购电费用的支付依据,也在随之不断地发展。

电能结算因受电网结构、地域环境、政策背景等因素的影响,各网省间差异较大,其结算的复杂性、差异性可以概括为如下4个方面。

1)结算的多样性。

随着电力交易的逐渐活跃,交易的品种也在不断创新与发展,形成了结算品种的多种多样。

2)结算的复杂性。

由于各电力交易的交易方式及经济特性不同,其对应的结算规则也往往不同,其中很多品种的结算关系与结算规则非常复杂。

3)结算的易变性。

近年来电力行业发展迅速,结算关系不断发生新的变化,结算规则也自然在随之发生着变化。

4)结算的差异性。

不同的电网拓扑结构、不同地域的客观环境与发展水平,都导致结算规则的差异。

基于上述结算业务特点,此前网省公司结算系统[2]采用的流程式软件开发[3]模式难以适应,结算系统的设计开发与系统维护越来越困难,面对频繁变化的结算规则,往往需要持续付出很高的成本,并且获得的时间响应较低。

本文提出的结算构件库正是解决这一问题的有效方法,它将结算过程进行抽象,通过业务建模[4],对结算业务进行分解,以稳定的模型支持变化的因素,解决了结算系统建设中的普遍问题,提升了系统的可扩展性与自适应能力。

1 构件化的结算系统设计

1.1 分解的层次与粒度

结算的构件化系统设计[5,6],主要是依据稳定性原则对业务的共性部分进行碎化分解与依赖分离,同时再支持分解后的重组与可替换。

将结算系统划分为模型层、业务逻辑层、数据层、服务层和表示层。结算的模型层为结算单元的基础模型及结算类型模型层;业务逻辑层为结算规则及结算算法层;数据层为基于结算模型的数据实例层;服务层为基于结算模型的调用接口与服务实例层;表示层主要为人机界面层。这里将核心业务的结算模型层及业务逻辑层纳入结算构件库的管理范畴。

此外,抽象出合适粒度的构件模型也是系统设计的关键。以低耦合、高聚合、重用性好为目标,充分考虑结算的业务特点与功能需求,将结算构件的粒度设计为结算单元与结算类型,即结算的构件库体现为基于结算单元与结算类型的描述与重构。

1.2 系统总体设计

结算系统的总体设计如图1所示。图中的结算单元为结算业务的最小单位,是结算系统的基础模型,通常为同一个电厂内相同容量机组的机组组合。结算的输入数据便以结算单元为口径,包括结算单元的上网电量、成分电量和成分电价。首先通过调用结算构件库的规则与算法进行结算计算,得到结算结果,之后对结算结果进行信息发布,同时也支持对结算结果的争议提交及对结算结果的确认。

2 结算构件库的研究与设计

为概括目前复杂多变、差异较大的结算业务需求,将电能结算的计算方法及可能的发展趋势进行归纳与抽象,以构件化的思想提出了结算构件库的概念与设计思路。

结算构件库由元素库、参数库、类型库、规则库、算法库和实例库组成[7],是以对计算过程和方法建模的思路,抽象出来的一套能够灵活扩展、支持配置和定义的建模方法[8]。

2.1 静态因素与动态因素

为了分析构件库的组成,首先梳理结算涉及的因素,在结算的诸多因素中,重点分离出结算的静态因素与动态因素。

结算类型的属性类,比如编码、电量、电价等属性均为客观的静态因素,它们不随时间的变化而变化,同时上述属性是一个结算类型的组成部分,这里将其定义为组成元素。另外,结算类型的参数,如是否峰谷结算、数据来源、结算口径等也是静态因素。

结算的类型(即结算品种)是动态因素,在不同的时间、地区,结算品种均会不同。同时,结算的规则也是动态变化的,因此结算规则也是动态因素,与此同时,描述结算规则与结算参数的结算算法也是动态因素。此外,结算单元开展的交易不同,其电量结构也会随之变化,因此,结算方法与结算单元之间的映射关系也作为动态因素。

2.2 因素抽象与组合

分析并整理结算的因素之后,按照功用与关联关系对结算因素进行分类,将描述类型的元素组成集合,称之为元素库;元素库的多个元素可组合成各类结算类型,将各类结算类型组成集合,可形成类型库。类似地,将结算类型的所有参数组成集合,称之为参数库,再将各类计算规则组织成规则库,通过规则与参数的组合,可组成为各类结算算法,形成算法库,将结算类型与结算算法进行映射匹配,组织成为实例库。

根据相互间的逻辑关系,形成了构件库的各个组成部分,包括元素库、参数库、类型库、算法库、规则库和实例库。

2.3 构件库的总体设计

结算构件库的总体框架如图2所示。

图2描述了构件库的组成,依据各个子库之间的关联关系,可由图3所示的树图更为直观地表示。图3中,各子库之间均为多对多的关系。

下面将分别介绍构件库中各子库的具体组成。

2.3.1 元素库

结算的类型元素描述一个结算类型的固有属性,也是结算类型的组成要素,包括类型标识ID、编码、名称、结算方、购电方、售电方、输电方、电量、电价、电费等。

元素库将上述的各类元素进行统一的组织与管理,同时支持结算元素的定义与扩展,当结算类型产生新的特性,现有的元素无法描述一个完整的结算类型时,将增加元素的定义,扩充元素库。

2.3.2 参数库

参数库作为结算类型的结算参数组成的集合,主要包括电量来源、电价来源、是否口径折算、是否峰谷结算、是否分解等参数。

参数库将上述各类参数进行统一的组织与管理,同时支持结算参数的定义与扩展,当结算的参数出现新特性,现有参数不能包含一个结算类型的所有结算参数时,将增加参数的定义,扩充参数库。

2.3.3 类型库

元素库管理各类结算类型的组成元素,由其中的若干元素进行组合,将形成各类结算类型,比如发电权类型(包括发电权交易的ID、编码、结算方、发电权交易的电量、电价和电费等),将各类结算类型组成集合,形成类型库。类型库所管理的结算类型支持定义与扩展,结算类型的定义以元素库为基础,通过元素组合而成。

2.3.4 规则库

结算的规则为结算的具体计算方法,一般表达为计算方法的逻辑关系与数学关系。

常规的结算规则可包括结算的优先级规则,描述了各结算类型的结算次序,也包括在结算优先级相同的情况下,结算的进一步分配规则,包括均分、按照计划电量分配、价格优先等方式。

特殊的结算规则可包括结算的固定成分规则,即按照结算的所有类型进行固定分摊,此时,当上网电量小于各成分的电量合计值时,某些结算成分应该计算出负值。

结算规则还支持条件判断、常规的数学运算及逻辑运算,支持面向过程的结算数据的数学处理。

规则库是对各类规则统一管理而形成的规则集合,作为结算方法的规则模型,提供调用接口。

2.3.5 算法库

前已述及,结算的参数描述了一个结算类型的结算属性,结算的规则描述了结算类型的处理原则及各结算类型或类型之间的逻辑与数学关系,再通过参数库与规则库的结合,形成各类结算的算法,比如全时段优先级算法、峰平谷固定分摊算法、特高压结算算法等。

结算算法支持内部调用,即支持算法的嵌套,比如大用户直接交易,需要按照大用户的结算细则进行结算处理,之后将其结果与基数电量等其他成分再进行优先级的结算。此时,在优先级算法中将嵌套大用户直接交易算法。

2.3.6 实例库

结算实例描述的是一个结算单元在不同的时间段内的结算方法,即对应的一个或一组结算算法。因此,通过创建结算单元与结算算法的映射关系,构建结算的实例库。

2.4 结算构件库的技术实现

2.4.1 构件库的建模

前面已经介绍了构件库各子库之间在功能和逻辑上的关系,由此建立结算构件库的统一建模语言(UML)类图模型,如图4所示。

图中,BaseData和BaseObject为基础类,其他类继承BaseObject,均有编码code、编号id、名称name、附件doc和备注remark。结算参数与结算元素的数据类型可为所枚举的长整形、浮点型、字符型、日期型、布尔型和菜单型中的一种。

下面介绍结算参数、结算规则和结算算法的逻辑关系。结算的规则库描述数学上的计算过程,而且是以尽量小的原子化计算函数予以表示,以便于重用。算法库作为对参数库和规则库的封装,用于组织对规则的调用与管理。算法库描述的是结算的最终调用算法,比如常规火电结算算法、水电结算算法、垃圾焚烧结算算法、供热结算算法等。结算规则描述的是细粒度的优先级结算规则、大用户直接交易结算规则、特高压结算规则等。一个结算算法可能调用一个或一组结算规则。

为实现上述逻辑关系,以箭头指向表示数据引用或依赖关系,设计结算构件库数据模型见图5。

2.4.2 静态库的扩展定义

属于静态因素的元素库和参数库为静态库,其包含的元素或参数支持定义与扩展。可通过组装的方式由元素库生成类型库,如图6所示。

2.4.3 面向描述的规则定义

规则定义的目的是将频繁变化的业务规则从程序中剥离出来,集中在规则库中管理修改,通过规则定义将结算规则翻译为面向计算过程的数学描述。

在构件库的设计模式下,结算计算的基本过程是首先依据配置的结算实例检索需要调用的结算规则,并触发规则中定义的一系列数据处理,完成对结算的数值结算过程。

下面将阐述规则定义的技术实现方法。

2.4.3.1 规则引擎技术

采用规则引擎技术来支撑结算的规则定义,这里选用开源的JBoss Rules规则引擎进行集成设计开发[9]。规则引擎的工作原理如图7所示。

首先制定规则文件并进行加载,形成Package规则包。在运行时将加载预处理的对象(facts),将其放入工作内存(Working Memory),同时使用规则匹配器(Pattern Matcher)将规则库(rules)与对象(facts)一一进行比较,将对象所激活的规则依次放入执行队列(Agenda)中,最后依次执行Agenda中的规则,直至执行完所有的规则。

基于规则引擎的结算系统总体框架见图8。

其工作机制如下:首先根据实例库的映射关系,得到该结算单元的结算算法,然后通过算法库找到该算法对应的规则组合,作为规则引擎调用的匹配条件,此时规则引擎将按该算法库所属的规则进行加载并依次执行。

2.4.3.2 文本型的规则定义

采用规则文件的方式进行规则的定义,可增强规则的可读性与可移植性。基于JBoss Rules技术的规则文件采用以.drl扩展名结尾的文本文件[10]。

下面以一个简单的实例予以说明,规则文件如图9所示。图中:L为实际外送电量;CiPi分别为结算单元i的特高压分月结算电量和月度外送计划。这里的LPi为规则的操作对象,规则中操作的对象可采用Java Bean类生成的对象,包含get与set方法,用于调用与操作。

除了在规则文件中可以描述结算成分的预处理过程,还可以利用规则的属性简单巧妙地解决一些规则问题,例如结算的优先级设定,可将结算类型的优先级别设置为该结算类型所对应规则的匹配优先级别(其属性是salience),通过改变匹配的优先次序,来实现结算成分分解的优先级计算。

3 基于构件库的结算系统实现

以构件库为结算业务处理的核心软件,构建了一整套支撑灵活结算、复杂结算的电力交易结算系统,该系统也为典型的模型—视图—控制(MVC)设计模式。其实现了如下功能。

1)结算单元模型管理。

支持结算单元模型管理。结算单元模型是基于结算口径的机组组合,对最小结算粒度的结算单元进行模型的创建与维护,形成结算系统的基础模型。

结算单元模型同时还包括单元模型的映射,通过映射关系描述,形成结算单元与其他系统的对应关系,以实现数据交互与信息共享。

2)结算构件库管理。

支持构件库静态信息菜单项的注册,形成结算构件库元素、参数、类型信息集合的菜单式管理,以便于进行配置化操作,形成友好直观的人机界面。此外,还基于菜单信息,形成结算规则、结算算法和结算实例的配置管理模块。

3)结算成分数据。

基于结算类型库所定义的结算类型即结算成分,对其数据进行获取与管理,根据成分的不同性质与不同来源,如合同类、考核类等,调用数据源接口进行数据的加载,同时支持对加载的数据进行维护与确认。

4)服务调用。

将结算构件库的计算逻辑封装成计算服务,通过调用形成结算结果,并进行人机展示。可支持人工触发与定时自动触发2种方式。

5)结算发布。

对结算结果进行发布,支持发布对象的选择及发布对象对结算结果的争议反馈。

6)结算接口。

经发布并确认过的结算结果,通过横向集成发送至财务部门,通过纵向贯通报送至上级部门。

4 结语

本文在目前开展的中长期电力交易的结算环境中,着重研究了面向结算规则的建模方法与技术方案,实现了对结算业务的抽象与分解,是对传统的面向对象系统设计方法的扩展与延伸,基于结算构件库建立的电力交易结算系统软件,使其由面向个体扩展到了面向整体,由面向单一系统扩展到了面向产品。经安徽、山西、湖北等多个网省的应用,总结应用特点如下。

1)实现结算系统核心软件的产品化推广。

通过结算构件库中结算元素、结算算法等基础构件的组装来实现软件产品,使其能够通过统一支撑的构件集合来快速构建业务系统,实现多个项目的快速投运。

2)高重用性与高可扩展性。

基于构件化的结算软件,无需对整体重构,而是通过对基础构件的重用与扩展,实现了对不同需求及需求变化的快速适应。

3)基于文件的规则配置。

采用规范化配置文件的方式,能够较好地支持业务算法与处理逻辑的可移植、可裁剪与可互换,并支持离线方式的编辑与调试,提高系统建设效率。

摘要:为解决电力交易结算品种及结算规则的复杂多变而带来的项目建设难题,文中提出了基于结算构件库的灵活结算方法,实现了网省间联络线结算及省内发电企业结算的业务抽象与统一建模。结算构件库由元素库、参数库、类型库、规则库、算法库和实例库组成,通过建立分层的业务对象模型,对电能结算业务进行构件化设计,形成结算业务的分解与再组合,最后以规则引擎技术对该方法进行了系统实现。所述方法已应用于多个区域及省级电力交易结算系统,实际运行证明了该方法灵活、有效。

关键词:电能结算,结算规则,构件库,规则引擎,建模,柔性

参考文献

[1]国家电监会.2010年度全国电力交易与市场秩序监管报告[R].2011.

[2]尚尔博.电力交易运营系统-结算管理子系统的设计与实现[D].沈阳:东北大学,2008.

[3]张弢.电力市场运营系统结算子系统的设计[J].电脑知识与技术,2010,6(22):6365-6366.ZHANG Tao.The design of power market system settlementsubsystem[J].Computer Knowledge and Technology,2010,6(22):6365-6366.

[4]刘福斌,杨立兵,洪元瑞.多适应电能交易模型设计及系统实现研究[J].华东电力,2011,39(1):27-32.LIU Fubin,YANG Libing,HONG Yuanrui.Study on thedesign and system implementation of multi-adaptive energytransaction model[J].East China Electric Power,2011,39(1):27-32.

[5]牛景春,申利民,杨化林.基于构件的柔性软件开发方法研究[J].计算机技术与发展,2009,19(9):72-75.NIU Jingchun,SHEN Limin,YANG Hualin.Study on methodof flexible software development based on component[J].Computer Technology and Development,2009,19(9):72-75.

[6]周忠华.面向消息应用的构件化方法[D].杭州:浙江大学,2010.

[7]杨争林,龙苏岩.结算管理系统设计与实现[C]//2007电力调度及厂站自动化新技术交流研讨会论文集,2007年12月6日,南京.

[8]程海花,耿建,胡俊,等.基于算法库的省内发电企业上网电量结算系统[J].电力系统自动化,2011,35(23):99-101.CHENG Haihua,GENG Jian,HU Jun,et al.A settlementsystem design for provincial power generation enterprises basedon algorithm library[J].Automation of Electric PowerSystems,2011,35(23):99-101.

[9]王李军,陶明亮,张曙,等.面向业务规则引擎研究[J].计算机工程,2007,33(24):52-56.WANG Lijun,TAO Mingliang,ZHANG Shu,et al.Researchon business rule engine[J].Computer Engineering,2007,33(24):52-56.

分布式构件库 篇4

随着对软件复用技术的深入研究和软件构件数量的迅速增长,构件库系统得到了广泛使用。它对软件构件进行管理,提供描述、分类、存储和检索等功能,满足用户查询和获取构件的需求。在构件库系统中,如何高效地检索,使用户能够快速定位到所需要的构件,成为了软件复用领域研究的关键问题之一。

近年来,根据刻面(facet)对软件构件进行分类以及按刻面进行检索的方式越来越受到重视。这种方法适用于大规模的构件管理,同时又是检索代价、复杂性和检索质量三者最为均衡的方法[1]。与一般的层次分类方式相比,刻面分类模式易于修改,也避免了一般的关键词分类方式容易出现的混乱,能够提高检索效率,而且有助于复用者理解构件和目标领域。基于以上优点,构件的刻面表示以及在此基础上的构件检索技术成为了研究的热点。

2 相关研究工作

构件的分类和检索方法有很多种,从构件表示出发可分为人工智能方法、超文本方法和信息科学方法三类[2],刻面分类检索方法属于信息科学法。现代构件库系统的刻面分类检索方法最早由Prieto-Diaz和Freeman提出,它通过抽取软件构件的某些本质特征(称之为刻面)来作为软件构件的描述符,对构件进行精确的分类。之后NATO和REBOOT也分别提出了基于刻面的构件分类标准与模型,现在国内的青鸟构件库就采用了以刻面分类为主、多种分类方式相结合的方法对构件进行分类索引[3],国外著名的开源软件网站sourceforge.net和freshmeat.net也提供了按刻面分类方式检索构件的功能。

但是很多现有的构件库对于一次在多个刻面下选择不同的术语进行检索的支持还不够,比如sourceforge构件库只能在功能领域这样的单一刻面下选择术语来浏览构件,对此,近年来出现了借鉴树匹配的相关结论来研究构件检索技术的方法[4]。这种方法将一个构件库中的刻面分类模式映射成一棵刻面树,检索构件时根据用户输入的信息和刻面分类模式生成一棵查询树,于是将构件的检索问题转化为两棵树的匹配问题,这也是目前刻面分类检索方式的主要研究方法。本文则从另一个角度出发,不需生成查询树,而是将用户在刻面树中选择的节点根据合理的并和交运算的规则,组合生成查询条件,结合数据库检索技术来实现构件的匹配。文中提出并分析了相关规则,给出了相应的算法以及在构件库中的实现方法。

3 刻面分类模式与刻面树

在研究刻面分类检索方法之前,必须首先了解刻面分类模式这一核心概念。

定义(刻面分类模式):一个刻面分类模式(faceted scheme)由一组描述构件本质特征的刻面组成,每个刻面从不同的侧面对构件库中的构件进行分类。每个刻面由一组基本的术语(term)构成,称为术语空间。一个构件可以被各个刻面下的一个或多个术语所描述,而每个刻面反映了对库中构件的一种划分[5]。

由定义可知,一个刻面分类模式包含多个刻面,每个刻面又对应数量不等的多个术语,构成该刻面的术语空间,因此可以很方便地采用树形结构来表示刻面分类模式,将其中的主刻面、子刻面分别映射为树中相应的父节点、子节点,将相应的术语映射为树的叶节点。按这种方法映射生成的树称为刻面树。一个刻面的术语空间中的术语之间也存在层级关系,例如术语T是“数据库管理系统”,术语T’是“Oracle数据库管理系统”,显然被T’描述的构件也能被T描述,称T是T’的上层术语,在刻面树中也映射为父节点和子节点。在构件库系统中,可以根据经验和实际需要设计刻面分类模式。

4 刻面分类模式的检索规则与算法

4.1 检索规则

规则1:如果用户检索时选择了某一刻面,则检索结果是该刻面下所有子刻面的术语空间中的所有术语所描述的构件集合的并集。

从刻面树的角度来看,以上规则可以解释为:选择了某个刻面节点,就相当于选择了以此节点为根的子树中的所有节点。根据规则1可以进一步得到以下规则:

规则2:如果用户选择了术语空间不相交(没有祖先-后代关系)的两个或多个刻面,那么检索结果应该是分别选择这些刻面所得结果的交集。

这是由于术语空间不相交的刻面分别从不同的角度出发对构件进行描述,因此用户要查找的是同时具有不同方面特性的构件,应该对单个刻面检索的结果取交集。

对于术语,由于构件本身的复杂性,或者由于构件库提供的刻面分类模式不够完善,对构件进行分类描述时,有些构件难以被分类到刻面树的叶节点,即最下层的术语,而只能笼统地分类到某个中间层术语,因此提出以下规则:

规则3:如果用户在检索时选择了某个非叶节点的术语,则检索结果是仅被此术语所描述而不被其下层术语所描述的构件。

对于选择了多个术语的情况,提出以下规则,这也是刻面检索中最常用的规则。

规则4:如果用户选择了同一刻面术语空间中的多个术语,那么检索结果是分别被这些术语所描述的构件集合取并集。如果用户选择了不同刻面术语空间中的多个术语,那么对每个刻面下选择的术语描述的构件集合取并集得到的结果再取交集作为最终的检索结果。

这是由于每个刻面的术语空间中的术语是从同一个角度描述构件,用不同的术语做关键词来将构件分为不同的种类,所以选择同一术语空间中的术语时,用户要查询的是分别属于这些种类的构件,应该对每个术语的检索结果取并集。而用户选择了不同刻面下不同术语空间中的术语时,与规则2的解释类似,应该在前面取并集的结果基础上再取交集,表示同时满足各个刻面下术语的构件。由规则2和规则4不难推论出以下规则。

规则5:如果用户选择了某些刻面和另一些术语空间与之不相交的其他刻面下的某些术语,那么检索结果应该是分别选择这些刻面所得结果和分别选择各个刻面下的术语所得结果的交集。

下面举例说明,某构件库提供的刻面分类模式如图1所示,该刻面树根节点下的两层是刻面层,刻面层下的两层是术语层,从A至F共6个黑色的节点表示用户在检索时选择的节点。

设每个术语t对应一个谓词Pt,如果用户在检索时选择了术语t,检索结果就是所有满足Pt的构件集合,记为Ct。类似地,将刻面f的检索结果记为Cf。根据规则1,以刻面A为根节点的子树中全部6个术语节点的检索结果取并集作为以刻面A为根的子树的检索结果,即CA=C1∪C2∪C3∪C4∪C5∪C6,同理可得CB=C7。根据规则2可得CP=CA∩CB。根据规则3,CC仅包含被术语C所描述的构件,不包含被其子节点术语所描述的构件。根据规则4,术语C、D、E同属于刻面M的术语空间,有CM=CC∪CD∪CE。又因为C、D、E与F属于不同刻面的术语空间,因此CQ=CM∩CN=(CC∪CD∪CE)∩CF。最后,根据规则5可得整个刻面树检索的最终结果为:

若根据规则2对CP和CQ做交运算也能得到相同的结果。

4.2 检索算法

根据规则可知,检索的过程是对刻面树进行深度优先搜索,因此将刻面树中节点按先序遍历的顺序排序,将排好的节点序列作为算法的输入。此外每个节点要记录自身的序号以及父节点序号,以便逐层向上查找祖先节点。具体的算法如下:

4.3 算法分析

虽然算法中有循环的嵌套,但内外层循环是对同一个循环变量进行,整个算法只需对所有刻面树节点进行一次遍历,因此对于输入的刻面树的节点总数n的时间复杂度是线性的,检索效率高。

5 刻面分类模式检索在构件库系统中的实现

在我们开发的构件库系统原型中,设计并实现了上述规则与算法。该系统为B/S结构,刻面树由6个刻面,120个术语构成,存储在服务器端数据库中,客户端网页上用Java Script编写了节点前带有选择框的树形结构来显示刻面树。由于刻面树中术语较多,一次下载整个树的所有节点需要较长时间,因此采用了ASP.NET AJAX框架提供的异步请求方式,客户端页面无需整页刷新,用户选择刻面和术语之后可以继续在页面上进行操作,提供了良好的用户体验。

在数据库的设计方面,刻面树表通过节点id和父节点id字段保存树形结构的层级关系,此外还有节点类型和节点名称字段。构件表中保存构件的id和名称、描述、关键词、作者、提交日期等相关信息。构件表与刻面树表之间通过关联关系表建立多对多的关系,该表使用了构件id和刻面树节点id两个外键。此外,由于刻面树表保存的信息在检索过程中将被大量频繁地访问,因此将其缓存在服务器的内存中,以进一步提高检索效率。

实际运行中,用户输入选择的节点,系统根据算法的输出生成SQL查询语句,完成数据库检索工作,将满足需求的构件列表返回给用户。经验证,该系统取得了良好的检索效果。

6 总结和下一步的工作

本文针对构件库系统中的大量软件构件,引入了构件的刻面分类模式,将构件的分类描述映射为刻面树,提出并分析了用户同时选择多个不同层次的刻面和术语时,对构件进行检索的规则,根据此规则给出了一种对刻面树进行深度优先搜索的检索算法,并论述了在实际构件库系统中的实现方法。基于刻面分类模式的检索方法相比单纯依靠关键词搜索或仅在某一个刻面下检索,可以在一定程度上提高构件检索的效率,降低用户查找和理解构件的成本。

在实际应用的构件库系统中,有了效率较高的检索方法之后,对数据库本身的优化,包括数据库的设计及其查询语句的优化成为提高整个系统的运行效率的关键,也是将来研究工作的重点。

参考文献

[1]高强,张晓明,边小凡.基于特定领域构件库系统中刻面分类模式的研究[J].计算机工程与应用,2003,30:82-84.

[2]陈元松,贾浩.软件构件管理与重用方法探究[J].电脑知识与技术,2007,(1):148-149.

[3]常继传,李克勤,郭立峰等.青鸟系统中可复用软件构件的表示与查询[J].电子学报,2000,28(8):20-24.

[4]王渊峰,张涌,任洪敏等.基于刻面描述的构件检索[J].软件学报,2002,13(8):1546-1551.

分布式构件库 篇5

关键词:SSH,软件构件,多语种构件库管理系统

0 引 言

软件复用避免了软件开发中的重复劳动,有效地解决软件危机,提高软件开发的效率和软件质量。软件构件技术是支持软件复用的核心技术,是近几年来迅速发展并受到高度重视的一个学科分支。基于构件的软件开发CBSD(component-based software development)是软件复用的一种实践方法,它在软件开发过程的各个阶段尽可能地利用可复用的构件,组装成新的应用软件系统。基于构件进行软件开发不仅需要有大量的可复用的构件,而且也需要有一个合理而高效的可复用软件构件库管理系统。在基于构件的软件开发中,构件管理系统是一个至关重要的部分,是实施软件复用的必备设施。

软件复用的思想日臻完善与成熟,然而对于新疆及中西亚地区多语种软件开发缺乏统一的标准规范,软件复用没有被很好地实施。由此看来,一个好的多语种构件库管理系统对于提高多语种构件复用的效率、提高软件开发速度、降低开发成本,有着非常好的作用。本文将构件库技术和目前受到极大关注的SSH框架技术相结合,提出了一种基于SSH的多语种构件库管理系统MCLMSBSSH(Multilingual Component Library Managing System Based on SSH)。

1 构件库管理系统研究现状

构件库管理系统可以有效地组织和管理大量可复用构件,并提供相应的工具支持构件提供者提交构件,构件使用者在软件开发的过程中方便地查询、理解和选择构件,使CBSD成为现实。因此,支持构件分类、组织、存储和查询的构件管理系统的研究是一项非常重要的工作,国内外学术界对此进行了深入研究,主要成果有ALOAF(Asset Library Open Architecture Framework)模型,RIG(Reuse library Interoperability Group)、NATO( North Atlantic Treaty Organization)等组织制订的软件复用标准,REBOOT(Reuse Based on Object-Oriented Technology)复用环境,北大青鸟工程的JBCLMS(Jade Bird Component Library Management System)系统。

(1) ALOAF模型

是STARS(Software Technology for Adaptable,Reliable Systems)项目为解决在构件库之间共享资源和无缝互操作问题而于1992年提交了一个开放体系结构的构件柜架报告。该报告充分体现STARS项目对可复用构件系统的认识,给出了一个构件库柜架的参考模型和该参考模型的一个实例——ALOAF模型,由此表明了以公共元模型为基础,在构件库之间交换信息和创建易于移植的复用工具是可能和必要的。

(2) RIG组织

为了实现在软件复用库间共享软件构件,解决构件库之间的可互操作性问题,在ALOAF的基础上开发了一个数据模型UDM(Uniform Data Model)。UDM定义了支持可互操作的构件库之间交换构件所需的信息,以此来达到构件库之间的无缝互操作。作为UDM的一个步骤,RIG开发了“BIDM(Basic Interoperability Data Model)”,它是UDM的一个子集,是实现互操作和构件库交换构件所需信息的最小集。

(3) NATO组织

制订了一组关于软件复用的标准——《可复用软件构件开发指南》、《可复用软件构件管理指南》和《软件复用过程指南》,其中《可复用构件库管理指南》讨论了有关构件库建立和管理的问题。

(4) REBOOT项目

是国际上比较著名的构件库系统,包括一个存储可复用构件的构件库和一组产生、认证、插入、提取、评价和适配可复用构件的环境。

(5) 北大青鸟构件库管理系统

是“基于构件—构架模式的软件复用支持系统”的核心子系统,用于对可复用构件进行描述、管理、存储、分类和检索,以满足基于“构件—构架”复用方式的软件开发过程的需要。

2 基于刻面分类的多语种软件构件描述

多语种软件构件技术已逐步成为研究的热点,而构件描述是多语种软件构件技术的关键所在。构件描述是基于构件的软件开发和构件利用过程中的一项关键技术,它规定了一个软件所需的结构和内容,不仅用于指导软件构件的设计、开发、管理、组装、测试等活动,而且可用于构件库的组织、存储、检索与浏览。多语种软件构件描述是建立多语种软件构件库的重要基础之一。多语种构件是采用刻面分类为主、多种分类模式相结合的方法进行分类。下面简单介绍基于刻面分类的多语种软件构件描述。

定义1 刻面是一棵有向树,根节点的值是该刻面的名称,根节点所有子树构成的森林称为术语空间,记为{Ti=<Vi,Ei>},其中Vi={v|v是一个节点,v的值是一个术语},Ei={<v1,v2| v1,v2∈V, v1和v2代表术语具有一般/特殊的关系>},术语空间中任意两个术语都不相同。

多语种构件的刻面描述可以展开为一棵刻面描述树,对于一个刻面描述方案,其中的刻面、术语分别对应父节点、子节点,对采用某个刻面描述方案描述构件,可以将其相应的刻面描述术语映射为对应的叶子节点。图1就是多语种描述刻面树。

MCLMSBSS中刻面信息目前主要考虑八大刻面:功能相关、开发语言、开发状态、面向用户、语言支持、操作系统、运行环境及封装类型。每个刻面由一组术语构成,称为术语空间。在图1所示的多语种刻面树中,刻面语言支持下有7个术语:英语、简体中文、繁体中文、维文、哈文、柯文、其它。刻面语言支持描述了一个多语种构件所支持的语言。

3 SSH技术软件架构

随着计算机信息技术和J2EE的飞速发展,为了更好地创建企业应用程序,出现了许多的Framework,一个典型的J2EE应用,至少包括以下三部分:表现层、业务逻辑层和数据持久层。文中用Struts2实现表现层,用Spring实现业务层,用Hibernate实现持久层,然后把这些框架无缝地整合起来,并应用到项目开发中。通过使用这些成熟的框架,能够减少重复开发工作量,缩短开发时间,降低开发成本,增强程序的可维护性、可扩展性和可移植性。

3.1 Struts2简介

Struts2是一个可扩展的JAVA EE Web框架。Struts2不是Struts1的简单升级,而是从WebWork升级而来的新版Struts。Struts2是对MVC设计模式的一种实现,提供了对开发MVC系统的底层支持。其体系结构图如图2所示。

由图2可知Struts2的工作机制。当一个初始请求到达Servlet容器,它会经过一系列的标准filter链,如ActionContextCleanUp为可选过滤器。接着FilterDispatcher被调用,通过询问ActionMapper决定一个请求和一个Action相关连。当ActionMapper决定了一个Action的调用,FilterDispatcher把请求处理交给ActionProxy。ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。接着ActionProxy生成一个ActionInvocation的实例,其负责命令执行,这样调用任何拦截器先于调用Action。一旦Acion执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。结果一般是调用一个在JSP或FreeMarker中绘制的模板。在表示过程中可以使用Struts2框架中继承的标签。

3.2 Spring简介

Spring 是一个AOP框架和IoC 容器。运用AOP 可以创建 “横切关注点”,在应用时将它们插入代码中,使得代码有良好的可重用性。IoC容器允许在需要生成对象的地方创建一个应用上下文,然后将这些对象传递给它们的合作对象。只需要在配置文件(applicationContext.xml)中声明对象间的关系,由IoC 容器管理这些对象, 在需要时由Spring提供。使用Spring,开发者可以有效地组织中间层对象,消除项目中单例类的大量使用以及对大量定制文件格式使用的需要。无论是使用JDBC 还是使用ORM, Spring提供了一个数据存取的一致性框架。

3.3 Hibernate简介

Hibernate是一个面向Java环境的轻量级O/R Mapping(对象/关系数据库映射)工具,其作用是对Java类与数据库中的表进行映射,完成数据的持久化,同时也提供数据的查询、一致性检查、事务管理等机制。与直接调用JDBC操作数据库相比,Hibernate可以大幅减少开发时人工使用SQL和JDBC处理数据的时间。程序员能够完全用面向对象的思维去设计系统,将全部精力集中在编程中,而不用关心数据库的连接、事务、并发性等问题。另外,由于在编程中不会有特定数据库相关的代码,所以我们可以很容易地移植数据库而不用修改JAVA代码(只需修改database schema及O/R映射文件),大大提高了系统的灵活性。

4 MCLMSBSSH的设计及实现

MCLMSBSSH主要涉及两大类角色——用户与管理员,对应系统的两个平台。在用户平台及管理员平台所涉及的系统功能点如图3所示。整个系统分为以下七个功能模块:用户管理、构件管理、文件管理、公告管理、邮箱管理、构件提交、高级搜索。本文系统按照SSH整合技术,明确分为表现层、业务逻辑层、持久化层。其中表现层用JSP技术结合Struts2强大的TagLib来实现,业务层由Spring实现业务组件的组装关联,通过依赖注入、AOP应用、面向接口编程,来降低业务组件之间的耦合度,增强系统兼容性和可扩展性,持久层通过Hibernate完成对象和关系的映射,并借助数据库技术来实现整个Web的应用。

系统开发环境:Myeclipse 5.5.1;后台数据库:Oracle9i;Web服务器:Tomcat 6.0。

可复用构件可以通过设计和再工程的方式获取,或直接从某个商业性的软件机构购买。构件库再对构件执行一个验证的过程以确保构件满足一定的质量标准,然后对构件进行分类和表示,并将其存入构件库中。多语种构件库管理系统的实质性问题,便是构件的入库流程的问题。图4是构件入库的流程图。

“构件登记表”主要包括构件的描述信息,构件实体信息及附件信息。构件的描述信息的包括:构件名称、当前版本、发布日期、构件描述、运行环境及刻面填写。这里用户要提交的刻面信息共有四个刻面,分别是:功能类型、封装形式、主要使用语言及语言支持。构件的实体提交分为三类:预览图片、代码实体和文档实体。其中代码实体包括:试用版、演示版和源码文件等。文档实体包括:构件功能需求说明、构件使用说明、构件设计说明和构件应用的成功案例等。如图4所示,构件库管理员收到构件制作者填写好的“构件登记表”,对“构件登记表”进行必要的检查。如果发现问题,则与构件制作者联系或检阅构件内容后解决发现的问题;没有问题,则送交构件审核委员。构件审核委员会对送交的构件进行评估,不合格则放弃;如果合格,返回给构件库管理员。构件库管理员使用构件库分类工具对构件进行分类,包括登记构建的基本属性,填写每个刻面,建立构件间的关系以及一次加入的多个新构件之间的关系。超级管理员决定构件是否可以入库,是则将构件存入构件库,并建立构件索引;否则将构件返回给构件库管理员,重新分类。下面就判定构件内容是否完整详加说明。

4.1 Struts2技术应用

表现层由Struts2实现。在Struts2中,使用FilterDispatcher和Action共同作为控制器。FilterDispatcher是一个标准的过滤器,它负责过滤所有的请求,并将这些请求转发给相应的Action。Struts2中的Action是一个POJO,它仅仅是进行一些简单的控制。Struts2的核心文件struts.xml内定义了Struts2的系列Action,定义Action时,指定该Action处理结果与视图资源之间的映射关系。下面就判定构件内容完整为例给出struts.xml的部分代码(JSP页面提交了名为CompAud的action请求):

在上面的struts.xml文件中,定义一个名为″CompAud″的action,它指定了三个result,result元素指定adu()方法返回值和视图资源之间的映射关系。当CompAudAction返回值为″success″时,构件内容完整,页面跳转到onecompAud.jsp,送交构件审核专家待审;当返回值为″nofacet″时,构件内容不完整,页面跳转到nofacet.jsp,直接联系构件制作者通知刻面术语提交不完整;当返回值为″noEntityUrl″时,构件内容不完整,页面跳转到noEntityUrl.jsp,直接联系构件制作者通知其没有提交构件实体信息。

4.2 Spring技术应用

业务逻辑层的主要功能是执行程序的逻辑部分,调用持久层来处理事务,并控制异常。在这一层使用包含AOP和IoC容器,降低了业务逻辑中各个类的相互依赖。Spring主要负责处理应用程序的业务逻辑和业务校验,管理事务;同时管理业务层级别的对象的依赖;而且在显示层和持久层之间增加了一个灵活机制;Spring把DAO对象和business service object搭配起来,通过调用DAO和持久层进行通信。下面是本系统中applicationContext.xml对应于构件内容完整性判定的部分代码:

4.3 Hibernate技术应用

在持久层数据库的操作上不是采用传统的JDBC,而是采用Hibernate中间件技术。建立Hibernate持久层,首先要将对象持久化,Hibernate通过XML文件来映射对象。在这里注意各种关系的映射,如 one to one、many to one、many to many、one to many等。例如本系统的用户提交TEMP_COMP_TERM(临时构件刻面术语表)对应的映射文件TempCompTerm.hbm.xml。在TempCompTerm类中定义了临时构件术语tempCTId,临时构件tempComponent及相关的术语term,文中截取映射文件的一部分加以说明,映射文件的属性和数据库表的字段是一一对应的,且类型一致。

在本系统中,使用hivernate.cfg.xml对Hibernate进行配置,因为使用XML文件更加方便直观,当增加Hibernate映射文件的时候,可以在hibernate.cfg.xml里面增加。使用XML时部分配置代码可通过第三方的开发插件协作生成,减少工作量。配置文件hibernate.cfg.xml代码如下所示:

Hibernate为Java提供了ORM持久化机制和查询服务,Hibernate将我们在Java类里使用的HQL语句转换成SQL语句,利用JDBC驱动进而操作数据源,完成数据的增加、删除、修改、查询等最底层的数据库操作。

5 结 论

多语种构件库管理系统的建设填补了新疆自治区相关领域建设的空白,可对促进面向中亚、西亚出口软件开发提供重要技术支持。MCLMSBSSH在传统的构件库管理系统的基础上采用了SSH框架,探索了基于SSH框架给WEB应用开发带来的巨大好处。随着软件复用的不断深入,SSH技术的不断发展及新疆地区软件业需求的提高,多语种构件库的功能将会不断完善。

参考文献

[1]杨芙清,梅宏,李克勤.软件复用与软件构件技术[J].电子学报,1992(2).

[2]STARS Technical Committee.Asset Library Open Architecture Frame-work Version 1.2[R].Informal Technology Report,STARS-TC-04041/001/02,1992.

[3]Reuse Library Interoperability Group.RIG Uniform Data Model for Re-use Libraries(UDM).RPS-002,1994.

[4]Reuse Library Interoperability Group.RIG Basic Data Model(BIDM).RPS-001,1993.

[5]NATO Communications and Information Systems Agency.NATO Stand-ard for Management of a Reusable Software Component Library,1991.

[6]梁洁辉.Web构件库管理系统的设计与实现[D].南京:南京理工大学,2004.

[7]曾皓.多语种软件构件库的分类与检索[D].北京:中国科学院研究生院,2008.

[8]李刚.Struts2权威指南——基于WebWork核心的MVC开发[M].北京:电子工业出版社,2007.

[9]李刚.整合Struts+Hibernate+Spring应用开发详解[M].北京:清华大学出版社,2007.

分布式构件库 篇6

关键词:分布式系统,构件模型,SMP,OpenMP,线程绑定

0 引 言

在松耦合的分布式系统中,应用对局部计算性能的需求不断提高(表现为对计算时延的敏感),因此将并行计算能力与分布式系统相结合是一个重要问题。所谓分布式系统是指一个系统的部件(包括计算机、传感器和执行机构等)处在不同的地理位置,但功能上合作的计算机系统[1]。从定义中可以看出,单纯的网络系统不是分布式系统,因为它没有任务上的分工合作机制。而任务的协同,要求有一定的时间约束。

在分布式系统中,当局部处理机执行的计算任务规模较大时,要求计算软件有较高的计算性能。目前,在一个处理器上集成多个计算内核比较普遍,称为对称多处理系统SMP(Symmetric Multi-Processor)。在SMP系统中,计算内核共享内存及数据总线,可以采用多线程并行计算获得更好的性能。

主要的操作系统都提供了多线程编程API,如Win32 Thread、Linux POXIS Thread等。但上述方法具有不可移植、编程繁琐的不足,限制了多线程技术的应用。而OpenMP技术具有增量并行的优点[2,3],即可以将一个串行程序代码逐步演化为并行程序代码。这使程序开发人员可以将并行程序编写划分为两个阶段:(1) 编写串行程序代码并调试;(2) 添加编译指导语句,逐步并行化原有程序并调试。这提高了并行程序的开发效率。

但是,已有的多线程模型没有考虑SMP系统中线程的无序迁移问题[3]。在操作系统的调度下,线程在多个内核之间频繁迁移会进行大量的数据移动操作,从而降低性能。本文针对该问题,在软件设计中提供了线程绑定的接口,能够改善多线程计算程序的执行效率。

相比于传统的分布式软件系统,本文将多线程并行计算技术与分布式松耦合环境相结合:SMP处理机的内部计算采用OpenMP多线程方式;网络上采用TCP/IP协议传输数据。并且,使用基于构件的软件工程方法CBSD(Component-based Software Development),提高了程序的可维护性和可重用性[4,5]。构件封装了程序的通信函数、配置逻辑和线程管理方法,从而提高系统对不同应用的适应性。通过构件组装,用户只需重新编写局部计算代码,缩短了开发时间。

1 OpenMP原理与线程绑定技术

OpenMP标准是一种SMP系统上的编程模型[2],它由编译指导、运行函数库和环境变量组成。这一规范简化了在SMP系统上创建多线程程序的开发过程。相比使用操作系统API来创建线程,OpenMP多线程有以下优点:

(1) 支持CPU内核数改变 当处理器升级到更多核后,已编译的OpenMP软件不需要重编译,就可以根据系统环境变量动态生成适当数量的线程。

(2) 编程模型易用性高 OpenMP通过编译指导语句就可将串行代码并行化,减少了程序员工作量。例如可以将无递归for循环自动分解为多线程。

(3)程序具有可移植性 使用OpenMP的多线程程序代码不需修改就可以在不同的操作系统上编译。

OpenMP的多线程程序的运行模型是:分叉与连接,在程序中局部的高计算负载代码段创建并行区。线程的分叉与连接是在并行区的首尾自动执行的,如图1所示。

首先,按照并发要素的不同,并行计算可以分为任务并行和数据并行,OpenMP支持这两种并发模型:

(1) 任务并行指一个程序可以分解为多个局部任务,且这些任务可以并发执行。在OpenMP中相应为并行分段模型:

在不同的section中,可以存在数据交换与协作执行,即线程同步与互斥关系。当使用barrier指导语句时,所有线程要在此处同步;而使用critical指导语句时,同时只能有一个线程进入[6]。

(2) 数据并行是指程序中所要计算的数据可以分解为多个数据块,并且这些数据块可以被独立地操作。在OpenMP中相应为并行循环(parallel for)模型:

这里需保证N阶for循环是非迭代的,即上一阶循环的结果不作为下一阶循环的输入。

其次,为了消除由于线程迁移而导致的性能降低,OpenMP线程绑定技术将线程固定在指定内核上运行。当前主要有两种方法实现线程绑定操作:环境变量方式和调用API方式。

(1) 主流编译器,如GCC,编译的OpenMP并行程序可以通过设置环境变量实现线程绑定。例如:

export GOMP_CPU_AFFINITY="1 3 5 7"

上述环境变量表示将四个线程绑定到CPU第1、3、5、7号内核上运行。

(2) 一些编译器,如Intel Compiler,支持使用线程绑定API,实现线程与内核的绑定。

在OpenMP程序中,可以使用kmp_set_affinity()函数来设置当前线程与内核core_id的绑定关系。本文使用这一方式,将在2.3节中详细说明。

2 构件模型的设计与实现

2.1 软件框架结构

本文提出的分布式构件模型是基于中间件设计的,中间件屏蔽了下层异构,并提供明确定义的接口,使分布式构件具有可移植性和简洁的内部结构。采用本构件实现的分布式系统具有如图2所示的分层结构。它包含三个主要部分:(1) 系统层,是基于网络的分布式的软硬件平台;(2)构件层,是可复用的分布式构件及其连接关系,实现数据处理逻辑;(3) 用户层,是完成用户数据的输入与显示的交互界面软件。

在构件层中,本文提出的组成分布式构件模型的三种基本构件为:计算单元(EU)、数据端口和连接子。在系统层中,OpenMP是并发计算中间件,为EU构件的设计提供了多线程并行计算能力。通信库的使用,使数据端口和连接子的设计与底层网络配置细节相隔离,如TCP、CORBA、COM等。

EU构件是最主要的基本构件,它负责计算任务的多线程执行与端口的管理等,以实现高性能的分布式计算。EU构件通过输入端口得到待处理数据,并通过输出端口将处理结果发送出去。端口为EU构件提供了输入输出缓冲区,并绑定对应具体网络的连接子。根据不同的分布式应用需求,可能需要在构件之间实现3种不同的通信方式:一对一、一对多或多对一。EU构件通过聚合多个端口,实现不同的通信拓扑结构。连接子封装了与网络硬件交互的通信代码,使通信与计算分离。这里的通信代码,可以使用TCP的socket API接口,或分布式中间件(如CORBA,DDS等)。

一个实际可部署的分布式构件的结构如图3所示,它由上述基本构件组合而成,称为复合构件。其中,EU构件包含多线程计算任务、线程管理和端口管理等功能属性。线程管理接口设定计算任务的线程数量,端口管理接口设定端口的添加与删除,并定义连接子间的连接关系。两个复合构件的输入连接子与输出连接子连接以实现数据传输,因此实际的分布式应用软件由多个复合构件组装而成。

一个复合构件的结构可以使用BNF范式进行描述,其中非终结符用斜体字加“< >”来表示,终结符用“[ ]”来表示:

<复合构件>::={<数据接口>, <计算单元>}

<数据接口>::={<输入端口集>, <输出端口集>}

<输入端口集>::={[输入端口1], [输入连接子1], …, [输入端口n], [输入连接子n]}

<输出端口集>::={[输出端口1], [输出连接子1], …, [输出端口n], [输出连接子n]}

<计算单元>::={[计算任务], [线程数]}

因此,基于本构件的分布式系统可以描述为:

<分布式系统>::={<构件实体集>, <构件关系集>}

<构件实体集>::={<复合构件1>, …, <复合构件n>}

<构件关系集>::={<构件连接1>, …, <构件连接n>}

<构件连接>::={[复合构件x的输出连接子a], [复合构件y的输入连接子b]}

2.2 分布式连接子的设计

通过构件化设计技术,将TCP通信代码封装,屏蔽了TCP的实现细节,具有很好的通用性。基于TCP的连接子与分布式中间件(如DDS、COM等)提供的复杂API相比,具有小巧易用的特点,并且避免了中间层故障而引起的系统崩溃。

连接子分为两类:输出连接子和输入连接子。这两类连接子与输出、输入端口相对应,并与相应端口直接交互。端口和连接子是连接关系。对应于TCP/IP协议,本文设计了相应的TCP连接子。

如图4所示,两类连接子connector_out类和connect_in类,都是connector类的实现并定义了数据收发的虚函数sendData()和recvData()。TCP连接子类继承于相应的父类,定义了私有的通信函数,并重写了父类的数据收发虚函数,实现了基于TCP的数据通信。

一对连接子在建立TCP连接时,使用一致的链路信息结构(link_info),其定义如下:

连接子实现TCP点对点通信的具体配置过程为:

(1) 数据发送方(conn_out_tcp)作为TCP通信中的服务端 首先绑定本地IP地址(my_info.ip_addr)及IP端口(my_info.ip_port)。之后等待连接请求,并建立TCP连接。

(2) 数据接收方(conn_in_tcp)作为TCP通信中的客户端 首先设定TCP连接目标的IP地址(my_info.ip_addr)即IP端口(my_info.ip_port)。然后发送连接请求,并返回套接字。

因此,建立通信要确定一致的链路信息,并告知一对连接子,其中ip_addr与发送方主机的IP地址一致。

2.3 OpenMP线程绑定的实现方法

在EU构件中,使用OpenMP实现线程到内核的绑定,以优化并行效率。在Intel Compiler中提供了对OpenMP标准的完整支持,并相应提供了一组线程绑定API。本文分析了有关API的实现方法,将其封装在计算构件(EUComp)类中。其具体代码为:

其中,函数参数me由kmp_create_affinity_mask(&me)初始化,用于储存当前线程设置的绑定信息。调用函数kmp_set_affinity_mask_proc(core, &me)可以建立指定的CPU内核core与变量me的对应关系。

bind()函数实现了SMP节点上的线程绑定方法,其调用位置在计算任务的OpenMP并行区中,由各个线程分别调用。在线程绑定实施之后,即可开始具体的计算工作。以并行for循环为例,其主要代码:

上述代码创建了4个计算线程,并将每个线程绑定到独立的内核运行。这一方法既充分利用了硬件资源、提高了并行度,又避免了线程无序迁移引起的性能下降。

3 应用实例与分析

在分布式系统的设计中,通常考虑处理机的计算性能和处理机间的网络通信时延。本实验设计了两个示例构件:(1) FFT构件,将512×1024个浮点FFT运算作为计算负载,对比了使用OpenMP线程绑定技术对计算性能的影响;(2) 数据源构件产生仿真数据,作为FFT构件的输入,以测试TCP连接子的数据传输性能。

实验的硬件平台是两台工作站通过千兆网络连接,Intel 4 cores 2.4GHz(支持HT超线程技术)、2G内存。软件平台为Linux 5.3 64bit和Intel Compiler 10.1及IPP函数库。其中,Intel IPP函数库提供了FFT计算函数。

在计算性能测试中,采用1、2、4、6、8个线程,分别进行有、无线程绑定的对比实验,共十组。每组实验执行5次取平均值。FFT构件中计算任务的主要代码如下:

从图5可以看出,在关闭线程绑定时,线程由1个增加到2个使计算并行度提高而计算时延减少。但当线程数继续增加时,由于线程的无序迁移和竞争资源的影响,导致计算时延显著增加。当线程数增加到8个时,计算时延达到了22ms(图中未标出)。这说明,在不使用线程绑定时,线程数的增加反而会使计算性能出现显著地下降。在开启线程绑定后,线程不迁移而使计算性能逐渐提高。也可以看出计算性能的提高与线程增加不呈线性关系,这是因为线程的管理开销也随之增大。当线程为8个时,线程管理开销过大而使性能略有下降。相比较而言,EU构件的线程绑定功能可以有效提高计算性能。

在网络性能测试中,两台处理机通过一个千兆交换机连接。使用四组不同大小的浮点数据块,通过TCP连接子在两台处理机间往返100次取平均值再除以2,测得单向通信时延,如图6所示。

可以看出随着数据块的增大,传输时延基本呈线性增加。通过计算,可以得出在不同的数据块大小时,网络的吞吐量基本为118.65MB/s,而千兆网络的理论峰值速率为125MB/s。可以看出,使用TCP连接子可以较好地利用网络带宽资源,能够满足分布式应用的需求。

4 结 语

分布式系统因其松耦合的特点而得到了广泛的应用,本文使用CBSD方法设计了一种支持OpenMP线程绑定的分布式构件模型。在分析了OpenMP线程绑定原理的基础上,该构件模型实现了线程绑定控制接口,提高了EU构件的计算性能。使分布式软件也可以满足一般的高性能计算需求,通过构件组装方法开发应用程序使程序具有较好的适应性。本文给出了使用TCP套接字的连接子的设计方案,以及EU构件中线程绑定接口的实现方案。通过实验验证,线程绑定能够有效提高多线程程序的执行效率,构件的数据传输能力也满足应用需求。

参考文献

[1]Hagit A,Jennifer W.分布式计算[M].2版.北京:电子工业出版社,2008.

[2]李建江,舒继武,陈永健,等.一种基于动态并行区的OpenMP程序开发模式[J].计算机研究与发展,2006.43(3):496-502.

[3]徐磊,徐莹,张丹丹.多核构架下OpenMP多线程应用运行性能的研究[J].计算机工程与科学,2009,31(11):50-53,57.

[4]王晨,周颖,张德富.一种并行分布对象的互操作模型[J].软件学报,1999,10(8):861-867.

[5]王静,吴健.一种基于分布式对象技术的分布式监控系统设计[J].计算机应用与软件,2007,24(9):83-84,90.

[6]武汉大学多核构架与编程技术课程组.多核构架与编程技术[M].武汉:武汉大学出版社,2010.

上一篇:急性毛细支气管肺炎下一篇:新闻科学