Drools快速入门(第二版)_第1页
Drools快速入门(第二版)_第2页
Drools快速入门(第二版)_第3页
Drools快速入门(第二版)_第4页
Drools快速入门(第二版)_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Drools规那么引擎规那么引擎简介规那么语言根底Drools高级语法局部大纲规那么引擎简介学习前的准备开发环境的搭建 在maven工程的pom.xml参加以下依赖 另外,Drools5也提供了eclipse的插件,可以参照网上的资料进行安装。

引入规那么引擎的背景现状在目前的很多行业应用中,如银行、保险、互联网金融等领域,存在着大量的业务规那么,这些业务规那么有如下的特点:业务规那么数量繁多、非常复杂、且规那么处于不断的更新变化中现有系统的很多做法是将业务规那么绑定在程序代码中。存在的问题当业务规那么变更时,对应的代码也得更改,即使每次小的变更都需要经历开发、测试验证上线等过程,变更的本钱比较大。长时间系统变得越来越难以维护。系统僵化,新需求插入困难。新需求上线周期较长。什么是规那么引擎规那么引擎是一种嵌套在应用程序中的组件应用,它实现了将业务规那么从应用程序代码中别离出来。规那么引擎使用特定的语法编写业务规那么。规那么引擎可以接受数据输入、解释业务规那么、并根据业务规那么做出相应的决策。

使用规那么引擎的好处实现业务逻辑与业务规那么的别离,实现业务规那么的集中管理可以动态修改业务规那么,从而快速响应需求变更使业务分析人员也可以参与编辑、维护系统的业务规那么使用规那么引擎提供的规那么编辑工具,使复杂的业务规那么实现变得的简单Drool5规那么引擎的工作原理简单的说,就是将用户编写的规那么文件(*.drl)通过工具类加载、编译、打成jar包后,参加到指定的地方〔一般是和规那么引擎打交道的会话session〕供规那么引擎去调用和执行。一个简单的例子一个简单的例子

一个简单的例子运行结果:在Drools当中,规那么的编译与运行要通过Drools提供的各种API来实现这些API总体来讲可以分为三类:规那么编译、规那么收集和规那么的执行主要有KnowledgeBuilder、KnowledgeBase、StatefulKnowledgeSession、StatelessKnowledgeSession等它们起到的作用主要是对规那么文件进行收集、编译、查错、插入fact、设置global、执行规那么或规那么流等一个简单的例子Drools的API之KnowledgeBuilder的作用用来在业务代码当中收集已经编写好的规那么,然后对这些规那么文件进行编译,最终产生一批编译好的规那么包〔KnowledgePackage〕给其它的应用程序使用。Drools的API之KnowledgeBase的作用用来收集应用当中知识(knowledge),在一个KnowledgeBase当中可以包含普通的规那么〔rule〕、规那么流(ruleflow)、函数定义(function)、用户自定义对象〔typemodel〕等KnowledgeBase本身不包含任何业务数据对象〔fact对象:JavaBeanset到WorkingMemory后的对象〕业务数据对象〔fact对象〕都是插入到由KnowledgeBase产生的两种类型的session对象当中〔StatefulKnowledgeSession和StatelessKnowledgeSession〕一个简单的例子Drools的API之statefulKnowledgeSession作用:规那么编译完成之后,编译好的规那么包文件在规那么引擎当中运行起来,StatefulKnowledgeSession主要作用是对规那么引擎进行交互。StatefulKnowledgeSession可以接受外部插入〔insert〕的业务数据——也叫fact使用完StatefulKnowledgeSession对象之后,一定要调用其dispose()方法fireAllRules()方法触发所有的规那么执行一个简单的例子Fact对象〔这个概念很重要,后面会陆续出现〕一个普通的JavaBean插入到规那么的WorkingMemory当中后的对象。当Fact对象插入到WorkingMemory当中后,会与当前WorkingMemory当中所有的规那么进行匹配,同时返回一个FactHandler对象。FactHandler对象是插入到WorkingMemory当中Fact对象的引用句柄。FactHandler对象可以实现对对应的Fact对象的删除及修改等操作。规那么主要是对fact对象进行操作,fact是规那么与应用系统交换数据的桥梁规那么语言根底规那么文件一个标准的规那么文件就是一个以“.drl”结尾的文本文件Packages和java的package差不多Imports和java的import一样Globals全局变量的声明Functions函数的声明,和javascript的函数声明差不多Queries,查询用Rules,规那么什么是规那么一个规那么(rule)由规那么名称、属性局部(attributes)、条件局部LHS(lefthandside)和结果局部LHS(lefthandside)组成当所有的LHS(lefthandside)匹配,rule可能“fire”规那么(rule)操纵应用程序中的数据(fact)

Rule格式条件局部LHS可以包含0~n个条件条件局部为空,引擎会自动添加一个eval(true),该条件返回为true,如:条件又称之为pattern(匹配模式),多个pattern之间用可以用and或or连接Pattern(匹配模式)语法如下:

$customer是绑定变量名,age>30是约束条件,其中变量[绑定变量名:]和[field约束]都是可以省略的。约束条件采用“&&”(and)、”||”(or)、和”,”(and)来实现对象内部多个约束在没有用小括号的情况下,优先级是:“&&”(and)、”||”(or)、和”,”(and),如下:符合条件的Customer对象,要么是age>20的,要么是gender==‘male’且city=‘sh’的

”,”不能与“&&”和”||”混合使用。比较操作符Drools5提供了12种类型的比较操作符,分别是:>、>=、<、<=、==、!=、contains、notcontains、memberof、notmemberof、matches、notmatches前6种使用比较多,后面的几种的使用,简单介绍下。比较操作符(contains和notcontains)contains是用来检查一个Fact对象的某个字段〔该字段要是一个Collection或是一个Array类型的对象〕是否包含一个指定的对象。格式:

notcontains正好和contains的功能相反。比较操作符(memberof和notmemberof)memberOf是用来判断某个Fact对象的某个字段是否在一个集合(Collection/Array)当中。格式:.notmemberof的功能正好和memberof的相反比较操作符(matches和notmatches)matches是用来对某个Fact的字段与标准的Java正那么表达式进行相似匹配。格式:notmatches正好和maches的功能相反。结果局部(RHS)只有在LHS的所有条件都满足时RHS局部才会执行.在RHS当中可以使用LHS定义的绑定变量名,设置的全局变量、或者是直接编写Java代码。RHS虽然可以直接编写Java代码,但不建议在代码当中有条件判断,如果需要条件判断,请重新考虑将其放在LHS当中,否那么就违背了使用规那么的初衷。在RHS里面,提供了一些对当前WorkingMemory实现快速操作的宏宏函数或对象比方insert/insertLogical、update和retract就可以实现对当前WorkingMemory中的Fact对象进行新增、删除或者是修改。Drools还提供了一个名为kcontext的宏对象。Kcontext的宏对象直接访问当前WorkingMemory的KnowledgeRuntimeInsert宏函数Java类中StatefulKnowledgeSession对象的insert方法的作用相同。都是用来将一个Fact对象插入到当前的WorkingMemory当中根本格式:注意:一旦调用insert宏函数,那么Drools会重新与所有的规那么再重新匹配一次,对于没有设置no-loop=true的规那么,如果条件满足,不管其之前是否执行过都会再执行一次。update、retract宏函数同样具有该特性。可以这么理解,在调用insert、update、retract宏函数时,会自动的用fireAllRules()方法触发所有的规那么执行。使用实例如右图:Update宏函数用来实现对当前WorkingMemory当中的Fact进行更新。

有两种用法形式(1)直接更新一个Fact对象,格式:(2)通过指定FactHandle来更新对应的Fact对象。

Update宏函数FactHandle来更新对应的Fact对象实例:retract宏函数用来将WorkingMemory当中某个Fact对象从WorkingMemory当中删除。

使用格式:restact(newObject())

drools宏对象Drools宏对象可以用来实现对当前的WorkingMemory控制。Modify表达式Modify表达式可以快速实现对Fact对象多个属性进行修改,修改完成后会自动更新到当前的WorkingMemory当中。格式:实例如:注意:一旦调用modify表达式,那么Drools会重新与所有的规那么再重新匹配一次,对于没有设置no-loop=true的规那么,如果条件满足,不管其之前是否执行过都会再执行一次。

insert、update、retract、modify需要注意的地方〔1〕它们都能使WorkingMemery里的fact对象发生变化。〔2〕都会自动调用fireAllRules()方法,自动触发规那么的执行。〔3〕触发规那么时,假设no-loop=true,新改变的fact对象,会对非自身的其它的所有规那么重新匹配一次。〔4〕触发规那么时,假设no-loop=false,新改变的fact对象,会对所有规那么〔包括自身〕重新匹配一次。〔5〕触发规那么时,匹配的原那么是:新改变的fact对象只去匹配条件包涵有fact对象的规那么表达式。〔6〕no-loop属性,只是针对自身触发的规那么有用。注意用好此属性,防止死循环属性局部Drools5中,规那么的属性共有13个,它们分别是:activation-group、agenda-group、auto-focus、date-effective、date-expires、dialect、duration、enabled、lock-on-active、no-loop、ruleflow-group、salience、when下面介绍几个常用的比较重要的属性salience,它的作用是用来设置规那么执行的优先级,默认是0,数字越大执行优先级越高,值也可以是负数。no-loop,它的作用是用来控制已经执行过的规那么在条件再次满足时是否再次执行。enabled,表示规那么是否可用,默认为true,值为false,表示该条规那么不可用。dialect,用来定义规那么当中要使用的语言类型,Drools5目前支持两种方言,分别是mvel和java,默认值为java属性局部(activation-group)该属性的作用是将假设干个规那么划分成一个组,用一个字符串来给这个组命名,这样在执行的时候,具有相同activation-group属性的规那么中只要有一个会被执行,其它的规那么都将不再执行。该属性的特点:规那么进行分组,同组成员互斥,只有一个规那么能执行成功。同组成员规那么的执行顺序,非常像if…elseif…elseif……的结构使用该规那么,有一点要特别注意:每个执行成功的规那么,只能成功的匹配一次属性局部(agenda-group)这个属性非常重要此属性的作用也是对规那么进行分组,拥有该属性组的规那么,需要用户手动激活才能执行该组的所有规那么。该属性的特点是:规那么分组,手动激活,按优先级顺序执行所有规那么。属性局部(lock-on-active)这个属性也非常重要当规那么使用*-group组属性时,如agenda-group、activation-group,在lock-on-action设置为true,可以防止因某些Fact对象被修改而导致已经执行过的规那么再次被激活执行。此属性的特点:只能配合*-group组属性一起使用,是no-loop属性的升级版,只不过,no-loop属性管理着单个规那么,而lock-on-active管理着规那么组。注释在Drools当中注释的写法与编写Java类的注释的写法完全相同,写法分两种:单行注释与多行注释单行注释,采用“#”或者“//”来进行标记,如下:多行注释,和Java语法完全一样,

以“/*”开始,以“*/”结束,如右图:函数Drools函数和javascript方法几乎一样,以function标记开头,如下:

可以在规那么文件的任何位置定义函数,和javascript不同的是,函数体是用java代码书写的。如下:函数的作用域只不过,规那么文件里定义的函数,作用域只能在本规那么文件内有效,超出该规那么范围,就不能生效了。为了解决这一问题,通常在实际应用中,使用java的静态方法,drools提供了一个特殊的import语句:importfunction;如下:查询在Drools当中查询以query关键字开始,以end关键字结束主要作用是对WorkingMemery里的fact对象进行统计及查询。无参查询格式:实例如右图:有参查询格式:

实例如右图:

Drools高级语法局部Agenda〔议程〕什么是议程当一个规那么完全被匹配,一个Activation(活动)被创立,引用的规那么和匹配的事实,被放置到议程中议程就是通过使用冲突解决策略控制这些活动的执行顺序冲突解决方案SalienceAgendaGroupActivationGroupRuleFlowGroup工作空间动作议程计算AgendaFilters〔议程过滤器〕运行或者阻止活动的引发Drools提供了一些开箱即用的过滤器也可以自定义过滤器,需实现AgendaFi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论