??xml version="1.0" encoding="utf-8" standalone="yes"?>
复杂企业U项目的开发以及其中随外部条g不断变化的业务规?business logic),q切需要分d业决{者的商业决策逻辑和应用开发者的技术决{,q把q些商业决策攑֜中心数据库或其他l一的地方,让它们能在运行时Q即商务旉Q可以动态地理和修改从而提供Y件系l的柔性和适应性。规则引擎正是应用于上述动态环境中的一U解x法?br />
本文W一部分要介l了规则引擎的生背景和Z规则的专家系l,W二部分介绍了什么是规则引擎及其架构和算法,W三部分介绍了商业品和开源项目实现等各种Java规则引擎Q第四部分对Java规则引擎APIQJSR-94Q作了详l介l,讲解了其体系l构Q管理API和运行时API及相兛_全问题,W五部分则对规则语言及其标准化作了探讨,W六部分l出了一个用Java规则引擎API的简单示例,W七部分l予结和展望?br />
1?介绍
1.1 规则引擎产生背景
企业理者对企业UITpȝ的开发有着如下的要求:(1)为提高效率,理程必须自动化,即C商业规则异常复杂(2)市场要求业务规则l常变化QITpȝ必须依据业务规则的变化快速、低成本的更?3)Z快速、低成本的更斎ͼ业务人员应能直接理ITpȝ中的规则Q不需要程序开发h员参与?br />
而项目开发h员则到了以下问?(1)E序=法+数据l构Q有些复杂的商业规则很难推导出算法和抽象出数据模?2)软g工程要求从需?>设计->~码Q然而业务规则常常在需求阶D可能还没有明确Q在设计和编码后q在变化Q业务规则往往嵌在pȝ各处代码?3)对程序员来说Q系l已l维护、更新困难,更不可能让业务h员来理?br />
Z规则的专家系l的出现l开发h员以解决问题的契机。规则引擎由Z规则的专家系l中的推理引擎发展而来。下面简要介l一下基于规则的专家pȝ?br />
1.2 Z规则的专家系l?RBES)
专家pȝ是h工智能的一个分支,它模仿hcȝ推理方式Q用试探性的Ҏ(gu)q行推理Qƈ使用人类能理解的术语解释和证明它的推理结论。专家系l有很多分类Q神l网l、基于案例推理和Z规则pȝ{?br />
RBES包括三部分:Rule BaseQknowledge baseQ、Working MemoryQfact baseQ和Inference EngineQ推理引擎)。它们的l构如下所C:
?.Z规则的专家系l组?/b>
如上图所C,推理引擎包括三部分:Pattern Matcher、Agenda和Execution Engine。Pattern Matcher何时执行哪个规则QAgenda理PatternMatcher挑选出来的规则的执行次序;Execution Engine负责执行规则和其他动作?br />
推理引擎通过军_哪些规则满事实或目标,q授予规则优先Q满事实或目标的规则被加入议程。存在两者推理方式:演绎法(Forward-Chaining正向链)和归UxQBackward-Chaining反向链)。演l法从一个初始的事实出发Q不断地应用规则得出l论Q或执行指定的动作)。而归Ux则是从假讑և发,不断地寻扄合假讄事实?br /> 2?规则引擎
2.1 业务规则
一个业务规则包含一l条件和在此条g下执行的操作Q它们表CZ务规则应用程序的一D业务逻辑。业务规则通常应该׃务分析h员和{略理者开发和修改Q但有些复杂的业务规则也可以由技术h员用面向对象的技术语a或脚本来定制。业务规则的理论基础?讄一个或多个条gQ当满q些条g时会触发一个或多个操作?br />
2.2 规则引擎
什么是规则引擎Q规则引擎是如何执行规则的?q可以称之ؓ"什??如何"的问题。到底规则引擎是什么还是目前业界一个比较有争议的问题,在JSR-94U也几乎没有定义。可以这栯为充分定义和解决?如何"的问题,"什?问题本质上也q刃而解。也许这又是一U?先有蛋还是先有鸡"哲学争论。今后标准规则语a的定义和推出及相x准的制定应该可以l这L问题和争论划上一个句受本文中Q暂且这栯说什么是规则引擎Q规则引擎由推理引擎发展而来Q是一U嵌入在应用E序中的lgQ实C业务决{从应用E序代码中分d来,q用预定义的语义模块编写业务决{。接受数据输入,解释业务规则QƈҎ(gu)规则做出业务决策?br />
2.3 规则引擎的用方?br />
׃规则引擎是Y件组Ӟ所以只有开发h员才能够通过E序接口的方式来使用和控制它Q规则引擎的E序接口臛_包含以下几种APIQ加载和卸蝲规则集的APIQ数据操作的APIQ引擎执行的API。开发h员在E序中用规则引擎基本遵循以?个典型的步骤Q创则引擎对象;向引擎中加蝲规则集或更换规则集;向引擎提交需要被规则集处理的数据对象集合Q命令引擎执?导出引擎执行l果Q从引擎中撤出处理过的数据。用了规则引擎之后Q许多涉及业务逻辑的程序代码基本被q五个典型步骤所取代?
一个开攄业务规则引擎应该可以"嵌入"在应用程序的M位置Q不同位|的规则引擎可以使用不同的规则集Q用于处理不同的数据对象。此外,对用引擎的数量没有限制?br />
2.4 规则引擎架构与推?br />
规则引擎的架构如下图所C:
?. 业务规则引擎架构
规则引擎的推理步骤如下:a. 初始数据(factQ输入至工作内存(Working Memory)。b. 使用Pattern Matcher规则库(Rules repository)中的规则QruleQ和数据QfactQ比较。c. 如果执行规则存在冲突QconflictQ,卛_时激zM多个规则Q将冲突的规则放入冲H集合。d. 解决冲突Q将Ȁzȝ规则按顺序放入Agenda。e. 执行Agenda中的规则。重复步骤b至eQ直到执行完毕Agenda中的所有规则?br />
M一个规则引擎都需要很好地解决规则的推理机制和规则条g匚w的效率问题?br />
当引擎执行时Q会Ҏ(gu)规则执行队列中的优先序逐条执行规则执行实例Q由于规则的执行部分可能会改变工作区的数据对象,从而会佉K列中的某些规则执行实例因为条件改变而失效,必须从队列中撤销Q也可能会激zd来不满条g的规则,生成新的规则执行实例q入队列。于是就产生了一U?动?的规则执行链QŞ成规则的推理机制。这U规则的"铑ּ"反应完全是由工作Z的数据驱动的?
规则条g匚w的效率决定了引擎的性能Q引擎需要迅速测试工作区中的数据对象Q从加蝲的规则集中发现符合条件的规则Q生成规则执行实例?982q美国卡耐基·梅隆大学的Charles L. Forgy发明了一U叫Rete法Q很好地解决了这斚w的问题。目前世界顶的商用业务规则引擎产品基本上都使用Rete法?br />
2.5 规则引擎的算?br />
大部分规则引擎品的法Q基本上都来自于Dr. Charles Forgy?979q提出的RETE法及其变体QRete法是目前效率最高的一个Forward-Chaining推理法QDrools目是Rete法的一个面向对象的Java实现QRete法其核心思想是将分离的匹配项Ҏ(gu)内容动态构造匹配树Q以辑ֈ显著降低计算量的效果?br />
3?Java规则引擎
目前L的规则引擎组件多是基于Java和C++E序语言环境Q已l有多种Java规则引擎商业产品与开源项目的实现Q其中有的已l支持JSR94Q有的正朝这个方向做出努力,列出如下Q?br />
3.1 Java规则引擎商业产品
Java规则引擎商业产品主要有(Jess不是开源项目,它可以免费用于学术研IӞ但用于商业用途则要收费)Q?br />
3.2 Java规则引擎开源项?br />
开源项目的实现主要包括Q?br />
Drools - Drools规则引擎应用Rete法的改qŞ式Rete-II法。从内部机制上讲Q它使用了和Forgy的算法相同的概念和方法,但是增加了可与面向对象语a无缝q接的节点类型?br />
Mandarax Z反向推理Q归UxQ。能够较Ҏ(gu)地实现多个数据源的集成。例如,数据库记录能方便地集成ؓ事实?facts sets)Qreflection用来集成对象模型中的功能。目前不支持JSR 94
OFBiz Rule Engine - 支持归纳?Backward chaining).最初代码基于Steven John Metsker?Building Parsers in Java"Q不支持JSR 94
JLisa - JLisa是用来构Z务规则的强大框架Q它有着扩展了LISP优秀特色的优?比Clipsq要强大.q些特色对于多范例Y件的开发是臛_重要?支持JSR 94
其它的开源项目实现有诸如Algernon, TyRuBa, JTP, JEOPS, InfoSapient, RDFExpert, Jena 2, Euler, JLog, Pellet OWL Reasoner, Prova, OpenRules, SweetRules, JShop2{等?br />
4?Java规则引擎API(JSR-94)
4.1 ?br />
q去大部分的规则引擎开发ƈ没有规范化,有其自有的APIQ这使得其与外部E序交互集成不够灉|。{而用另外一U品时往往意味需要重写应用程序逻辑和API调用Q代仯大。规则引擎工业中标准的缺乏成Zo人关注的重要斚w?003q?1月定Eƈ?004q?月最l发布的JSR 94QJava规则引擎APIQ得Java规则引擎的实现得以标准化?br />
Java规则引擎API由javax.rules包定义,是访问规则引擎的标准企业UAPI。Java规则引擎API允许客户E序使用l一的方式和不同厂商的规则引擎品交互,像使用JDBC~写独立于厂商访问不同的数据库品一栗Java规则引擎API包括创徏和管理规则集合的机制Q在Working Memory中添加,删除和修改对象的机制Q以及初始化Q重|和执行规则引擎的机制?br />
4.2 介Java规则引擎API体系l构
Java规则引擎API分ؓ两个主要部分:q行时客户API(the Runtime client API)和规则管理API(the rules administration API)?br />
4.2.1规则理API
规则理API在javax.rules.admin中定?包括装蝲规则以及与规则对应的动作(执行?execution sets)以及实例化规则引擎。规则可以从外部资源中装?比如说URI,Input streams, XML streams和readers{等.同时理API提供了注册和取消注册执行集以及对执行集进行维护的机制。用admin包定义规则有助于对客戯问运行规则进行控制管?它通过在执行集上定义许可权使得未经授权的用h法访问受控规则?br />
理API使用cRuleServiceProvider来获得规则管?RuleAdministrator)接口的实?规则理接口提供Ҏ(gu)注册和取消注册执行集.规则理?RuleAdministrator)提供了本地和q程的RuleExecutionSetProvider.在前面已提及,RuleExecutionSetProvider负责创徏规则执行?规则执行集可以从如XML streams, input streams{来源中创徏.q些数据来源及其内容l汇集和序列化后传送到q程的运行规则引擎的服务器上.大多数应用程序中,q程规则引擎或远E规则数据来源的情况q不多见.Z避免q些情况中的|络开销,API规定了可以从q行在同一JVM中规则库中读取数据的本地RuleExecutionSetProvider.
规则执行集接口除了拥有能够获得有兌则执行集的方?q有能够索在规则执行集中定义的所有规则对?q得客戯够知道规则集中的规则对象q且按照自己需要来使用它们?
4.2.2 q行时API
q行时API定义在javax.rules包中,则引擎用戯行规则获得结果提供了cdҎ(gu)。运行时客户只能讉K那些使用规则理API注册q的规则Q运行时API帮助用户获得规则对话q且在这个对话中执行规则?br />
q行时API提供了对厂商规则引擎API实现的类gJDBC的访问方?规则引擎厂商通过cRuleServiceProvider(cRuleServiceProvider提供了对具体规则引擎实现的运行时和管理API的访?其规则引擎实现提供l客?q获得RuleServiceProvider唯一标识规则引擎的URL.
URL推荐标准用法是用类?com.mycompany.myrulesengine.rules.RuleServiceProvider"q样的Internet域名I间,q将有助于访问URL的唯一?cRuleServiceProvider内部实现了规则管理和q行时访问所需的接?所有的RuleServiceProvider要想被客h讉K都必ȝRuleServiceProviderManagerq行注册。注册方式类gJDBC API的DriverManager和Driver?br />
q行时接口是q行时API的关键部?q行时接口提供了用于创徏规则会话(RuleSession)的方?规则会话如前所q是用来q行规则?q行时API同时也提供了讉K在service provider注册q的所有规则执行集(RuleExecutionSets).规则会话接口定义了客户用的会话的类?客户Ҏ(gu)自己q行规则的方式可以选择使用有状态会话或者无状态会话?br />
无状态会话的工作方式像一个无状态会话bean.客户可以发送单个输入对象或一列对象来获得输出对象.当客户需要一个与规则引擎间的专用会话?有状态会话就很有?输入的对象通过addObject() Ҏ(gu)可以加入C话当?同一个会话当中可以加入多个对?对话中已有对象可以通过使用updateObject()Ҏ(gu)得到更新.只要客户与规则引擎间的会话依然存?会话中的对象׃会丢失?br />
RuleExecutionSetMetaData接口提供l客戯其查找规则执行集的元数据(metadata).元数据通过规则会话接口(RuleSession Interface)提供l用戗?br />
使用q行时Runtime API的代码片断如下所C?
RuleServiceProvider ruleProvider = RuleServiceProviderManager.getRuleServiceProvider |
Rule Markup language (RuleML)
http://www.ruleml.org/ Simple Rule Markup Language (SRML)
http://xml.coverpages.org/srml.html Business Rules Markup Language (BRML)
http://xml.coverpages.org/brml.html SWRL: A Semantic Web Rule Language Combining OWL and RuleML
http://www.daml.org/2003/11/swrl/
多种规则语言的用得不同规则引擎实C间的兼容性成为问?通用的规则引擎API或许可以减轻不同厂家API之间的问?但公用规则语a的缺乏将仍然ȝ不同规则引擎实现之间的互操作?管业界在提出公用规则语a上做Z一些努? 比如说RuleML,SRML的出?但距获得绝大部分规则引擎厂商同意的公用标准q有很长的\要走?br />
6?Java规则引擎API使用CZ
6.1 讄规则引擎
Java规则引擎的管理活动阶D开始于查找一个合适的javax.rules.RuleServiceProvider对象Q这个对象是应用E序讉K规则引擎的入口。在J2EE环境中,你可能可以通过JNDI获得RuleServiceProvider。否则,你可以用javax.rules.RuleServiceProviderManagerc:
javax.rules.RuleServiceProviderManager class: |
RuleAdministrator admin = serviceProvider.getRuleAdministrator(); |
RuleRuntime runtime = rsp.getRuleRuntime(); |
业务规则理pȝ的基本原理是Q用一个或多个规则引擎替换以程序代码“固化”在应用pȝ中的业务逻辑。一个完善的BRMS可以对业务规则的整个生命周期实现全程理?
业务规则的全生命周期理如图1所C。BRMS在应用系l中的地位与数据库管理系l(DBMSQ类|处于比较基础的位|,是其他高端应用的基石。图2是GIGA Information Group l出的IT架构中BRMS的位|图?
业务规则理如何实现Q?
业务规则
一个业务规则包含一l条件和在此条g下执行的操作Q它们表CZ务规则应用程序的一D业务逻辑。业务规则通常应该׃务分析h员和{略理者开发和修改Q但有些复杂的业务规则也可以由技术h员用面向对象的技术语a或脚本来定制。业务规则的理论基础?讄一个或多个条gQ当满q些条g时会触发一个或多个操作?
规则引擎
q是一U嵌入在应用E序中的lgQ它的Q务是把当前提交给引擎的数据对象与加蝲在引擎中的业务规则进行测试和比对Q激z那些符合当前数据状态下的业务规则,Ҏ(gu)业务规则中声明的执行逻辑Q触发应用程序中对应的操作?
目前L的规则引擎组件多是基于Java和C++E序语言环境。在2000q?1月,Java Community ProcessQ简UJCPQ?l织开始着手v草Java规则引擎的API标准Q即JSR 94 规范。参与JSR 94赯的有BEA、IBM、ILOG、甲骨文、Novell、ATG、Unisys、Fujitsu{著名的软g企业。JSR 94 ?003q?1?5日正式定E,支持JSR 94标准的规则引擎也几乎同时推向市场Q包括ILOG 的JRules和Blaze的Advisor?
规则引擎的用方?
׃规则引擎是Y件组Ӟ所以只有开发h员才能够通过E序接口的方式来使用和控制它Q规则引擎的E序接口臛_包含以下几种APIQ加载和卸蝲规则集的APIQ数据操作的APIQ引擎执行的API。开发h员在E序中用规则引擎基本遵循以?个典型的步骤Q创则引擎对象;向引擎中加蝲规则集或更换规则集;向引擎提交需要被规则集处理的数据对象集合Q命令引擎执?导出引擎执行l果Q从引擎中撤出处理过的数据。用了规则引擎之后Q许多涉及业务逻辑的程序代码基本被q五个典型步骤所取代?
一个开攄业务规则引擎应该可以“嵌入”在应用E序的Q何位|,不同位置的规则引擎可以用不同的规则集,用于处理不同的数据对象。此外,对用引擎的数量没有限制?
规则引擎的内部实?
规则引擎的基本机制是Q对提交l引擎的数据对象q行索,Ҏ(gu)q些对象的当前属性值和它们之间的关p,从加载到引擎的规则集中发现符合条件的规则Q创些规则的执行实例。这些实例将在引擎接到执行指令时、依照某U优先序依次执行。一般,规则引擎内部׃面几个部分构成:工作内存Q用于存放被引擎引用的数据对象集合;规则执行队列Q用于存放被Ȁzȝ规则执行实例;静态规则区Q用于存放所有被加蝲的业务规则,q些规则按照某U数据结构组l,当工作区中的数据发生改变后,引擎需要迅速根据工作区中的对象现状Q调整规则执行队列中的规则执行实例。规则引擎的l构C意囑֦?所C?
M一个规则引擎都需要很好地解决规则的推理机制和规则条g匚w的效率问题?
当引擎执行时Q会Ҏ(gu)规则执行队列中的优先序逐条执行规则执行实例Q由于规则的执行部分可能会改变工作区的数据对象,从而会佉K列中的某些规则执行实例因为条件改变而失效,必须从队列中撤销Q也可能会激zd来不满条g的规则,生成新的规则执行实例q入队列。于是就产生了一U“动态”的规则执行链,形成规则的推理机制。这U规则的“链式”反应完全是由工作区中的数据驱动的?
规则条g匚w的效率决定了引擎的性能Q引擎需要迅速测试工作区中的数据对象Q从加蝲的规则集中发现符合条件的规则Q生成规则执行实例?982q美国卡耐基·梅隆大学的Charles L. Forgy发明了一U叫Rete法Q很好地解决了这斚w的问题。目前世界顶的商用业务规则引擎产品基本上都使用Rete法?
BOM赋予规则行业Ҏ(gu)?
业务规则一定是针对某种业务的,不同的业务有自己Ҏ(gu)的业务模型——业务对象模型(Business Object ModeQ简UBOMQ。BOMZ务规则语a提供了绝大多数的词汇Q多׃务系l分析员设计Q由开发h员具体实现。从面向对象的编E角度来看,BOM是一个简化的cdQ类图中有类名、类的属性、类的方法等。这些要素都是业务规则语言中的基本“词汇”。BOM的来源可以是Java对象模型、C++对象模型、XML Schema、Web服务定义{?
假定我们有一个简单的宠物商店购物车应用程序,在这个应用程序中Q顾客能够在购物车中攑օ各种宠物和相关物品对象。这个应用程序的业务对象集合可以有ShoppingCart(购物?、Customer(用户)、Item (条目)和ItemType(条目cd)q几个类?
表述业务规则的语法就是业务规则语a。由于规则语a的用者主要有两类:业务人员和技术h员,所以规则语a一般也分ؓ两类Q“面向程序技术”的规则语言Q它技术性很强,可读性较弱,比较适合IT 技术h员用,一般每个规则引擎开发商都有自己的一套“面向程序技术”的规则语言语法Q不qOASISl织定义了不同应用情况下的规则语a规范Q包括SRMLQSimple Rule Markup LanguageQ,BMRL(Business Markup Rule Language)和RuleMLQRule Markup LanguageQ等Q“面向业务”的规则语言Q它是业务h员用的语言Q必d备非技术性和可定制性,通常它需要经q“翻译”之后才能被规则引擎解析。BRMS必须提供q种“翻译”机Ӟ而开发h员要实现从“面向业务”规则语a到“面向程序”规则语a的映?
“面向业务”的规则语言无论从语法上q是语句l构上都可能千变万化Q不同行业可能有自己的“行话”。一个好的BRMS应该提供一个完善的规则语言框架Q能够迅速地Z务h员定制不同的“行话”,否则业务人员q是无法真正成ؓ业务规则的主人?
“单U”的规则如何互连?
业务规则有一个非常明昄Ҏ(gu):单纯性。每个业务规则只描述自己Ҏ(gu)的条件和满条g的操作,业务规则本nq不兛_它与其他规则的关p,如优先关pR互斥关pR包含关pȝ。每个业务规则本w可以有自己的属性,U元信息Q可以用来处理规则之间相x,例如引擎可以使用规则的优先来依序执行规则的操作?
有些BRMSq提供一U称为“规则流”的定制功能。规则流是一个图表,定义了解决问题或执行业务程的顺序。类gl一建模语言QUMLQ的zd图,׃lQ务以及定义这些Q务之间执行顺序的转换逻辑l成。一个{换由条g控制Q只有当该限制条件ؓ“真”时才能完成q种转换?
q些d可以是规则Q务、函CQ务或子规则流d。规则Q务包含一l要作ؓdM执行的规则,规则的执行逻辑q戯|的d属性严格控制。这些属性决定规则的排序、规则触发策略、执行算法等Q函CQ务包含要作ؓdM执行的脚本代码;子规则流d则包含Q务开始后依ơ执行的子规则流?
Z方便开发h员和业务人员理业务规则QBRMS必须提供h直观用户界面的工h实现业务规则理。规则管理工兯应该具备以下功能:规则的定制和~辑、规则流的定制、决{表形式的规则定制、规则的查询、规则有效期限的控制、规则的l织l构、规则模板的定制、规则库讉K权限的控制、规则变更历史的记录、规则文档的理{?
·资?·
业务规则理pȝ其实是一l工具集Q它包括Q规则引擎、规则库、规则语a框架、规则管理集成开发环境。业务规则管理系l的基本工作原理如图所C?
规则引擎QRules EngineQ?
是执行业务规则的软glgQ它嵌入在程序中Q是业务规则理pȝ的核心元素。规则引擎的cd有:单型、数据中心型和面向事务型?
规则库(Rules RepositoryQ及其服务机?
用于存储规则和规则元数据QMeta DataQ以及与规则有关的属性。它提供一l工L于存储、分cR查询、版本控制、权限控制、测试、提交等Q规则的状态和有效性可以跟t。规则库可以依托文gpȝ或数据库理pȝ?
规则语言框架QRules Language FrameworkQ?
规则语言一般分Zc:“面向程序技术”的规则语言Q用者是技术h员;“面向业务”的规则语言Q用者是业务人员。规则语a框架则ؓ定制“面向业务”的规则语言提供支持?
规则理工具QRules Management ToolQ?
用于理、创建、修改和部v业务规则的图形化工具Q易用性强Q除了开发h员外Q业务h员也可以使用q套囑Ş化工具实现对规则的管理?
规则集成开发环境(Rules IDEQ?
一般规则集成开发环境只有规则编辑器Q而高U的规则集成开发环境可以实现对规则和规则库的管理:如规则的创徏、分cR检索、修攏V版本控制、权限管理等Q甚臛_以实现对多个规则引擎的“在U쀝调试;对规则集合进行冲H检查等?
一个完整的BRMS应该提供规则理QRules ManagementQ、规则部|Ԍules DeploymentQ、规则分析(Rules AnalysisQ、规则定制和设计QRules Design and AuthoringQ等功能?
Q计机世界?W?4?B6、B7Q?/p>