基于Drools的领域专用语言应用研究
- 格式:pdf
- 大小:242.16 KB
- 文档页数:4
* 收稿日期:2011-10-20,修回日期:2011-12-03** 邓 伟,男,1986年生,硕士研究生,研究方向:Drools规则引擎。
文章编号:1003-5850(2012)02-0008-04基于Drools的领域专用语言应用研究邓 伟(太原科技大学计算机科学与技术学院,太原 030024)
摘 要:首先介绍了Drools规则引擎和领域专用语言DSL的基本概念,然后通过实例说明了DSL以类自然语言的方式来构建业务层代码,详细阐述了领域专用语言在Drools中的应用来说明它的优点。通过DSL的应用不仅降低了业务逻辑与应用程序的耦合度,而且能以更好的方式来处理业务需求和数据模型的变化,便于系统的维护。关键词:Drools,DSL,规则引擎,领域专用语言,可维护性中图分类号:TP312 文献标识码:A
ResearchonDomainSpecificLanguageBasedonDroolsDENGWei(SchoolofComputerScienceandTechnology,TaiyuanUniversityofScienceandTechnology,Taiyuan030024,China)
Abstract:Inthisthesis,thebasicconceptofruleengineanddomainspecificlanguageaboutDroolsisintroducedatfirst.Then,wedescribeDSLindetailwithsomeexamplesinordertoprovetheadvantageofDSL.NotonlycanDSLreducethedegreeofcouplingbetweenbusinesslogiclayerandapplicationlayer,butalsoitdealswithchangestotherequirementsorchangestothedatamodelinamuchbetterway.Itishelpfultothemaintenanceofthesystem.Keywords:Drools,DSL,ruleengine,domainspecificlanguage,maintenance
随着软件规模越来越庞大,业务需求经常变动,J2EE架构在业务逻辑层的不足越来越明显。业务需求的变动往往使得业务逻辑层代码大幅度改动,Java规则引擎[1]的出现弥补了这方面的不足。Java规则引擎起源于基于规则的专家系统。它将业务逻辑与应用程序分离,大大提高了系统的可维护性、可重用性。Drools是比较优秀的规则引擎之一。它的核心是DroolsExpert,也可称为RuleEngine,它将事实与业务规则进行匹配,推理出结论。它是由RedHat支持的,用Java语言编写的开源规则引擎。Drools实现了JSR94标准[2],即Java规则引擎API标准的规则引擎。JSR94提供了规则解析与注册、规则执行、规则过滤等的接口。实现JSR94标准的好处在于减少了学习其他实现该标准的规则引擎的时间,而且各种实现该标准的规则引擎之间可以相互替换,而且不用改变应用程序。Drools带来的主要优点在于,它使得规则对于业务分析人员和一个新的开发者来说很容易理解;系统的可维护性高;很容易增加新的规则,修改和移除已经存在的规则;需求很自然地转换成规则;规则的可重用性与应用程序分离;能够嵌入到现有的应用中来实现其中某些部分的功能。
1 Drools规则引擎1.1 Drools组成部分Drools是一个业务逻辑集成平台,它经历过5次大的发展里程,最新版本为Drools5.3,它主要由以下4个部分组成:规则引擎本身RuleEngine,复杂事件处理模块DroolsFusion,工作流模块DroolsFlow,业务规则管理系统模块DroolsGuvnor[3]。规则引擎模块是Drools的核心部分,通过它来处理基本的业务规则,该模块贯穿于整个Drools业务逻辑平台。通常情况下规则操作的大部分都是静态的事实数据集合。但是对
・8・(总88)基于Drools的领域专用语言应用研究2012年 于某些系统,它需要定义随着时间变化而变化的事实,基本的规则引擎无法高效处理这种情况,必须由复杂事件处理模块来处理。复杂事件处理模块也称为事件流处理模块。它是以事件驱动的架构方式来处理业务规则的。工作流模块很容易将业务逻辑以图形的方式展现,十分直观,便于业务逻辑的理解。工作流模块能够相对高效地来处理复杂业务逻辑。业务规则管理系统模块,有利于编写高效的规则,有效地管理规则和调试规则编得的是否正确。通过规则管理系统可以编写基于规则的单元测试、规则的集成测试、规则的接受度测试、并能创建测试脚本。另外还有一个很重要的部分,即解析器模块和关于Drools的Eclipse插件的模块,并具有语法错误检查和自动编译以及其他的辅助性的作用,方便规则高效编写与开发。Drools还提供了一个可选的模块DroolsSolver。它是建立于Drools
规则引擎之上的搜索算法用来解决计划任务。1.2 Drools规则引擎核心算法Drools规则引擎采用Rete00[4]算法通过推理来进行事实和模式间的匹配。Rete00算法是一种改进了的Rete[5]算法。由于Rete算法是以空间来换取时间,大大提高了事实和模式间匹配的效率,因此它广泛应用于专家系统和规则引擎中。Rete00加入了面向对象的概念,它是通过节点共享,以空间换取时间来提高匹配的效率。该算法的推理过程如下所示:将初始事实存入WorkMemory。将事实与类型节点进行比较,如果匹配,则执行,否则不匹配。将事实与Alpha节点进行比较,如果匹配,则执行,否则不匹配。将事实与Beta节点,即连接节点进行比较,如果匹配,则执行,否则不匹配。匹配完成,进入终止节点。将与规则匹配的规则放入Agenda。使用规则引擎执行Agenda里的规则。重复~,直到所有Agenda中的规则都执行完毕。该算法会从规则的条件部分产生一个网络。当规则包加入到规则库中,网络就产生了。图1显示了一个比较简单的Rete网络。图1中的Rete网络将产生两个匹配模式。最左侧部分无连接节点,只要alpha节点满足匹配,则匹配成功。右侧部分由连接节点将左右两部分相连接。可以看到这两个模式在图中交叉的部分即产生了节点共享。节点共享的好处在于它大大减少了内存的占用。图1 Rete网络2 DSL在Drools中的应用2.1 领域专用语言DSL简介目前业务规则的实现大部分是由开发人员来实现的。通常情况下,技术人员需要不断地将业务领域中的概念转换成相应的代码模型,然后再进行修改,这种间接性造成了计算机的程序不太可能做到与业务领域中的概念完全一致。有时候,这些业务规则需要业务分析人员能够阅读和理解,因此业务规则的可读性和用户的友好性是规则引擎的一个重要的方面。DSL[6](DomainSpecificLanguage)的主要目的就是以贴近业务领域的方式,即以类自然语言[7]的方式来构造软件。DSL的简洁性往往是思维上的简洁性,使得我们不用花费太多精力就能看懂代码所对应的业务含义。J2EE中的DAO、POJO、DTO、Action等对于开发者已经很清晰,但是DSL更加注重强调使用业务词汇,使得业务人员也能够通过DSL来理解和修改业务代码。DSL相当于是一个转换器,它能够将业务领域的语言转换成规则语言,提供给规则引擎使用。2.2 DSL在Drools中的应用Drools[8]中规则通常存放在drl规则文件中,通过对规则的解析来实现应用程序与业务逻辑的分离。结合一个小实例来说明DSL在Drools中的应用来充分说明DSL的优势。例如,对于这样的业务需求:如果两个用户的电话号码相同,则视该用户为同一个用户,删除其中一个用户,并显示一条警告信息。用户在Java
中用User类表示,并重写equals方法,判断电话号码相同则两个对象相同。对于上述业务需求可以表示成如下规则:rule“twoEqualPhoneNumber”when$User1:User(phoneNumber1!=null)$User2:User(phoneNumber1!=null,eval($User1!=$User2),this==$User1)thenSystem.out.println("thesame");retract($User2);
・9・ 第25卷 第2期电脑开发与应用(总89)validationReport.addMessage(reportFactory.createMessage(Message.Type.WARNING,kcontext.getRule().getName(),$User2));end上述规则对于专业人员都得花费一定的时间来理解语句的意思,而对于非专业人士则上述规则的描述更是晦涩难懂,他们甚至不明白这些语句所要表达的意思。DSL的出现使得业务领域的术语能够转换成规则语言来进行表达。在Drools中DSL相当于一个转换器,它能将某一领域内的术语转换成规则语言,转换的过程定义在DSL中,而这些业务领域内的术语则存放在dslr中。只要DSL文件中对应于dslr文件中的转换映射部分不存在问题,那么在Drools中,dslr文件通过DSL转换之后的结果是一个符合语法的DRL文件,这种转换相当于实现了类自然语言到规则语言的转换。对于上述DRL文件中规则表达的意思,可以写在dslr文件中,如下所示:expanderuserValidation.dslrule"twoEqualPhoneNumber"whenTheUser-1hasanphoneNumber1TheUser-2hasanphoneNumber1-samephoneNumberasUser-1thenremovetheUser-2DisplayWARNINGfortheUser-2end从上述dslr文件中,能够快速辨认出它所表达的意思。通过DSL可以将业务规则以类自然语言的方式来表达,这样有利于更好地理解业务规则。仅仅有上述的dslr还不能实现业务规则与规则引擎中的规则进行转换,而必须通过DSL文件将dslr文件进行正确的映射,才能够在Drools中使用。DSL文件如下:[condition][]The{object}-{id}={object}-{id}[condition][]{object}-{id}hasan{field}=${object}{id}:{object}({field}!=null)[condition][]-samephoneNumberas{object}-{id}=this==${object}{id},eval(${object}1!=${object}2)[consequence][]the{object}-{id}={object}-{id}[consequence][]Display{messagetypeenum}for{object}-{id}=validationReport.addMessage(reportFactory.createMessage(Message.Type.{messagetypeenum},kcontext.getRule().getName(),${object}{id}));[consequence][]remove{object}-{id}=retract(${object}{id});通过上述的dslr和DSL文件,就能够产生DRL文件。产生的DRL规则文件是比较特殊的,它是不能直接更改的,这是因为dslr文件转换成Drools中的基本规则这一过程是在内存中进行的,并不真正产生DRL文件。要想改变规则的话只需要改变dslr和对应的DSL中的映射部分就行了。DSL文件的编写既可以用eclipse插件来编写,也可以用一般的文本编辑器来编写。通过Drools在Eclipse中的插件DRLViewer,可以查看转换前业务领域的术语和转换后的规则描述是否正确地对应。此外,DRLViewer还可以检查编写DSL是否正确,定位出错误出现的地方,方便修改业务规则。3 DSL在Drools中的转换3.1 业务需求转换流程在Drools中将业务术语转换成为规则语言是通过DSL接口。图2是在Drools中将业务需求转换成能够处理的规则语句的转换流程图。业务分析人员或领域专家将业务领域中的概念转换成领域专用语言存放于dslr文件中,该语言是一种类自然语言。业务领域中的概念转换到类自然语言中,这种过渡是很平缓的。DSL能够将领域专用语言转换成规则语言,从而实现了业务需求到业务规则的转换。在不改变规则的前提下,可以改变领域专用语言,使得它更加友好和便于业务的理解。3.2 DSL规则映射与加载DSL文件的一般格式为:[][]=mapping>Scope的取值有以下几个:Condition:指定映射被用于条件部分;consequence:指定映射被用于结果部分;*:指定映射可用于以上两部分;Keyword:指定可以应用于整个文件。对于多个条件ObjectType(条件1,条件2,条件3,…,条件n)的映射文件可处理为:[condition][]对于ObjectType的描述=