《Drools快速入门(第二版)(精制资料)》由会员分享,可在线阅读,更多相关《Drools快速入门(第二版)(精制资料)(48页珍藏版)》请在金锄头文库上搜索。
1、Drools规则引擎规则引擎1严选课件规则引擎简介规则语言基础Drools高级语法部分大纲2严选课件规则引擎简介规则引擎简介3严选课件学习前的准备学习前的准备开发环境的搭建开发环境的搭建在在maven工程的工程的pom.xml加入以下依赖加入以下依赖 另外,另外,Drools5也提供了也提供了eclipse的插件,可以参照网上的资料进行安装。的插件,可以参照网上的资料进行安装。 4严选课件引入规则引擎的背景引入规则引擎的背景 现状现状 在目前的很多行业应用中,如银行、保险、互联网金融等领域,存在着大量的业务规则,这些业务规则有如下的特点:业务规则数量繁多、非常复杂、且规则处于不断的更新变化中
2、现有系统的很多做法是 将业务规则绑定在程序代码中。 存在的问题存在的问题当业务规则变更时,对应的代码也得更改,即使每次小的变更都需要经历开发、测试验证上线等过程,变更的成本比较大。长时间系统变得越来越难以维护。 系统僵化,新需求插入困难。新需求上线周期较长 。5严选课件什么是规则引擎什么是规则引擎规则引擎是一种嵌套在应用程序中的组件应用,它实现了将业务规则从应用程序代码中分离出来。 规则引擎使用特定的语法编写业务规则。规则引擎可以接受数据输入、解释业务规则、并根据业务规则做出相应的决策。 6严选课件使用规则引擎的好处使用规则引擎的好处 实现业务逻辑与业务规则的分离,实现业务规则的集中管理可以动
3、态修改业务规则,从而快速响应需求变更使业务分析人员也可以参与编辑、维护系统的业务规则使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单 7严选课件Drool5规则引擎的工作原理规则引擎的工作原理 简单的说,就是将用户编写的规则文件(*.drl) 通过工具类加载、编译、打成jar包后,加入到指定的地方(一般是和规则引擎打交道的会话session )供规则引擎去调用和执行。 8严选课件一个简单的例子一个简单的例子9严选课件一个简单的例子一个简单的例子 10严选课件一个简单的例子一个简单的例子运行结果:在Drools当中,规则的编译与运行要通过Drools提供的各种API来实现 这些AP
4、I总体来讲可以分为三类:规则编译、规则收集和规则的执行 主要有KnowledgeBuilder、KnowledgeBase、StatefulKnowledgeSession、StatelessKnowledgeSession等 它们起到的作用主要是对 规则文件进行收集、编译、查错、插入fact、设置global、执行规则或规则流等11严选课件一个简单的例子一个简单的例子 Drools的的API之之 KnowledgeBuilder的作用用来在业务代码当中收集已经编写好的规则, 然后对这些规则文件进行编译, 最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用。 D
5、rools的的API之之 KnowledgeBase的作用用来收集应用当中知识(knowledge) ,在一个KnowledgeBase 当中可以包含普通的规则(rule)、规则流(rule flow)、函数定义(function)、用户自定义对象(type model) 等KnowledgeBase本身不包含任何业务数据对象(fact对象:JavaBean set到Working Memory后的对象) 业务数据对象(fact对象)都是插入到由KnowledgeBase产生的两种类型的session 对象当中(StatefulKnowledgeSession和StatelessKnowled
6、geSession) 12严选课件一个简单的例子一个简单的例子Drools的的API之之 statefulKnowledgeSession作用作用:规则编译完成之后,编译好的规则包文件在规则引擎当中运行起来,StatefulKnowledgeSession主要作用是对规则引擎进行交互。StatefulKnowledgeSession 可以接受外部插入(insert)的业务数据也叫fact使用完StatefulKnowledgeSession 对象之后, 一定要调用其dispose()方法fireAllRules()方法触发所有的规则执行 13严选课件一个简单的例子一个简单的例子Fact对象(这
7、个概念很重要,后面会陆续出现)一个普通的JavaBean 插入到规则的WorkingMemory当中 后的对象。当 Fact对象插入到WorkingMemory当中后,会与当前WorkingMemory当中所有的规则进行匹配,同时返回一个FactHandler对象。FactHandler 对象是插入到WorkingMemory当中Fact对象的引用句柄。FactHandler 对象可以实现对对应的Fact 对象的删除及修改等操作。规则主要是对fact对象进行操作, fact是 规则与应用系统交换数据的桥梁 14严选课件规则语言基础规则语言基础15严选课件规则文件规则文件一个标准的规则文件就是一
8、个以“.drl”结尾的文本文件Packages和java的package差不多Imports和java的import一样Globals全局变量的声明Functions函数的声明,和javascript的函数声明差不多Queries,查询用Rules ,规则 16严选课件什么是规则什么是规则一个规则(rule)由规则名称、属性部分(attributes)、条件部分LHS(left hand side)和结果部分LHS(left hand side) 组成当所有的LHS(left hand side)匹配,rule可能“fire”规则(rule)操纵应用程序中的数据(fact) 17严选课件Rul
9、e格式格式18严选课件条件部分条件部分LHS 可以包含可以包含 0n 个条件个条件条件部分为空,引擎会自动添加一个条件部分为空,引擎会自动添加一个eval(true),该条件返回为,该条件返回为true,如:,如:条件又称之为条件又称之为 pattern(匹配模式匹配模式),多个,多个 pattern之间用可以用之间用可以用 and 或或 or 连接连接Pattern(匹配模式匹配模式)语法如下:语法如下: $customer是绑定变量名,是绑定变量名,age30是约束条件,其中变量是约束条件,其中变量绑定变量名绑定变量名:和和field约束约束都都是可以省略的。是可以省略的。 19严选课件约
10、束条件约束条件 采用采用 “&”(and)、”|”(or)、和、和”,”(and)来实现对象内部多个约束来实现对象内部多个约束在没有用小括号的情况下,优先级是:在没有用小括号的情况下,优先级是: “&”(and)、”|”(or)、和、和”,”(and),如下:,如下:符合条件的符合条件的Customer对象,要么是对象,要么是age20的,要么是的,要么是gender=male且且city=sh的的 ”,” 不能与不能与 “&”和和”|” 混合使用。混合使用。 20严选课件比较操作符比较操作符Drools5提供了提供了12种类型的比较操作符,分别是:种类型的比较操作符,分别是: 、 =、 、
11、=、 = =、 !=、 contains、 not contains、memberof、not memberof、matches、not matches前前6种使用比较多,后面的几种的使用,简单介绍下。种使用比较多,后面的几种的使用,简单介绍下。 21严选课件比较操作符比较操作符(contains和和not contains)contains 是用来检查一个是用来检查一个 Fact 对象的某个字段(对象的某个字段(该字段要是一个该字段要是一个 Collection或是一个或是一个 Array 类型的对象类型的对象)是否包含一个指定的对象。)是否包含一个指定的对象。格式:格式: not cont
12、ains正好和正好和contains的功能相反。的功能相反。22严选课件比较操作符比较操作符(memberof和和not memberof)memberOf 是用来判断某个是用来判断某个 Fact 对象的某个字段是否在一个集合对象的某个字段是否在一个集合(Collection/Array)当当中。中。格式:格式:. not memberof的功能正好和的功能正好和memberof的相反的相反 23严选课件比较操作符比较操作符(matches和和not matches)matches 是用来对某个是用来对某个 Fact 的字段与标准的的字段与标准的 Java 正则表达式进行相似匹配。正则表达式进
13、行相似匹配。格式:格式:not matches正好和正好和maches的功能相反。的功能相反。 24严选课件结果部分结果部分(RHS)只有在只有在 LHS 的所有条件都满足时的所有条件都满足时 RHS 部分才会执行部分才会执行.在在 RHS 当中可以使用当中可以使用 LHS 定义的绑定变量名定义的绑定变量名, 设置的全局变量、或者是直接编写设置的全局变量、或者是直接编写 Java 代码。代码。RHS 虽然可以直接编写虽然可以直接编写 Java 代码,但不建议在代码当中有条件判断,如果需要条件代码,但不建议在代码当中有条件判断,如果需要条件判断,请重新考虑将其放在判断,请重新考虑将其放在 LHS
14、 当中,否则就违背了使用规则的初衷。当中,否则就违背了使用规则的初衷。 在在 RHS 里面,提供了一些对当前里面,提供了一些对当前 Working Memory 实现快速操作的宏宏函数或对象实现快速操作的宏宏函数或对象比如比如 insert/insertLogical、 update 和和 retract 就可以实现对当前就可以实现对当前 Working Memory中中的的 Fact 对象进行新增、删除或者是修改。对象进行新增、删除或者是修改。 Drools 还提供了一个名为还提供了一个名为 kcontext 的宏对象。的宏对象。Kcontext的宏对象直接访问当前的宏对象直接访问当前 Wo
15、rking Memory 的的 KnowledgeRuntime 25严选课件Insert宏函数宏函数 Java 类中类中 StatefulKnowledgeSession 对象的对象的 insert 方法的作用相同。方法的作用相同。都是用来将一个都是用来将一个 Fact 对象插入到当前的对象插入到当前的 Working Memory 当中当中基本格式:基本格式:注意:注意: 一旦调用一旦调用 insert 宏函数,那么宏函数,那么 Drools 会重新与所有的规则再重新匹配一次,会重新与所有的规则再重新匹配一次,对于没有设置对于没有设置 no-loop=true 的规则,如果条件满足,不管其
16、之前是否执行过都会再执的规则,如果条件满足,不管其之前是否执行过都会再执行一次。行一次。update、retract 宏函数同样具有该特性。宏函数同样具有该特性。 可以这么理解,在调用可以这么理解,在调用insert 、update、retract宏函数时,会自动的用宏函数时,会自动的用 fireAllRules()方法触发所有的规则执行方法触发所有的规则执行 。 使用实例如右图:使用实例如右图: 26严选课件Update 宏函数宏函数 用来实现对当前用来实现对当前 Working Memory 当中的当中的 Fact 进行更新。进行更新。 有两种用法形式有两种用法形式 (1) 直接更新一个直
17、接更新一个 Fact 对象,格式:对象,格式:(2) 通过指定通过指定 FactHandle 来更新对应的来更新对应的 Fact 对象。对象。 27严选课件Update 宏函数宏函数 FactHandle 来更新对应的来更新对应的 Fact 对象实例:对象实例: 28严选课件retract宏函数宏函数 用来将用来将 Working Memory 当中某个当中某个 Fact 对象从对象从 Working Memory 当中删除。当中删除。 使用格式:使用格式: restact(new Object() ) 29严选课件drools宏对象宏对象 Drools宏对象可以用来实现对当前的宏对象可以用来
18、实现对当前的Working Memory 控制。控制。 30严选课件Modify表达式表达式 Modify表达式可以快速实现对表达式可以快速实现对 Fact 对象多个属性进行修改,修改完成后会自动更新对象多个属性进行修改,修改完成后会自动更新到当前的到当前的 Working Memory 当中。当中。 格式:格式:实例如:实例如:注意:注意: 一旦调用一旦调用 modify表达式表达式 ,那么,那么 Drools 会重新与所有的规则再重新匹配一次,会重新与所有的规则再重新匹配一次,对于没有设置对于没有设置 no-loop=true 的规则,如果条件满足,不管其之前是否执行过都会再执的规则,如果
19、条件满足,不管其之前是否执行过都会再执行一次。行一次。 31严选课件insert、update、retract、modify需要注意的地方需要注意的地方 (1)它们都能使)它们都能使Working Memery里的里的fact对象发生变化。对象发生变化。(2)都会自动调用)都会自动调用fireAllRules()方法,自动触发规则的执行。方法,自动触发规则的执行。(3)触发规则时,若)触发规则时,若no-loop=true,新改变的,新改变的fact对象,会对对象,会对非自身的其它的所有规非自身的其它的所有规则则重新匹配一次。重新匹配一次。(4)触发规则时,若)触发规则时,若no-loop=f
20、alse,新改变的,新改变的fact对象,会对对象,会对所有规则(包括自身)所有规则(包括自身)重新匹配一次。重新匹配一次。(5)触发规则时,匹配的原则是:新改变的)触发规则时,匹配的原则是:新改变的fact对象对象 只去匹配只去匹配 条件包涵有条件包涵有fact对象对象的规则表达式的规则表达式 。 (6)no-loop属性,只是针对属性,只是针对 自身触发的规则有用。自身触发的规则有用。 注意用好此属性,避免死循环注意用好此属性,避免死循环 32严选课件属性部分属性部分 Drools5中,规则的属性共有中,规则的属性共有 13 个,它们分别是:个,它们分别是:activation-group
21、、agenda-group、auto-focus、date-effective、date-expires、dialect、duration、enabled、lock-on-active、no-loop、ruleflow-group、salience、when 下面介绍几个常用的比较重要的下面介绍几个常用的比较重要的 属性属性 salience,它的作用是用来设置规则执行的优先级,默认是,它的作用是用来设置规则执行的优先级,默认是0,数字越大执行优先级越,数字越大执行优先级越高,值也可以是负数。高,值也可以是负数。 no-loop,它的作用是用来控制已经执行过的规则在条件再次满足时是否再次执行。
22、,它的作用是用来控制已经执行过的规则在条件再次满足时是否再次执行。 enabled,表示规则是否可用,默认为,表示规则是否可用,默认为true,值为,值为false,表示该条规则不可用。,表示该条规则不可用。 dialect,用来定义规则当中要使用的语言类型,用来定义规则当中要使用的语言类型, Drools5 目前支持两种方言,分别是目前支持两种方言,分别是mvel 和和 java,默认值为,默认值为java 33严选课件属性部分属性部分(activation-group) 该属性的作用是将若干个规则划分成一个组,用一个字符串来给这个组命名,这样在该属性的作用是将若干个规则划分成一个组,用一个
23、字符串来给这个组命名,这样在执行的时候,具有相同执行的时候,具有相同 activation-group 属性的规则中只要有一个会被执行,其它的属性的规则中只要有一个会被执行,其它的规则都将不再执行。规则都将不再执行。该属性的特点:规则进行分组,同组成员互斥,只有一个规则能执行成功。该属性的特点:规则进行分组,同组成员互斥,只有一个规则能执行成功。同组成员规则的执行顺序,非常像同组成员规则的执行顺序,非常像ifelse ifelse if 的结构的结构 使用该规则,有一点要特别注意:每个执行成功的规则,使用该规则,有一点要特别注意:每个执行成功的规则,只能成功的匹配一次只能成功的匹配一次 34严
24、选课件属性部分属性部分(agenda-group ) 这个属性非常重要这个属性非常重要 此属性的作用也是对规则进行分组,拥有该属性组的规则,需要用户手动激活才能执此属性的作用也是对规则进行分组,拥有该属性组的规则,需要用户手动激活才能执行该组的所有规则。行该组的所有规则。 该属性的特点是:规则分组,手动激活,按优先级顺序执行所有规则。该属性的特点是:规则分组,手动激活,按优先级顺序执行所有规则。 35严选课件属性部分属性部分(lock-on-active) 这个属性也非常重要这个属性也非常重要 当规则使用当规则使用 *-group组属性时,如组属性时,如agenda-group、activat
25、ion-group,在,在lock-on-action设置为设置为true,可以,可以避免因某些避免因某些Fact对象被修改而导致已经执行过的规则再次被激活执对象被修改而导致已经执行过的规则再次被激活执行行。此属性的特点:只能配合此属性的特点:只能配合*-group组属性一起使用,组属性一起使用, 是是no-loop属性的升级版,只不过,属性的升级版,只不过,no-loop属性管理着单个规则,而属性管理着单个规则,而lock-on-active管理着规则组。管理着规则组。 36严选课件注释注释 在在 Drools当中注释的写法与编写当中注释的写法与编写 Java 类的注释的写法完全相同,写法分
26、两种:类的注释的写法完全相同,写法分两种: 单行单行注释与多行注释注释与多行注释单行注释,采用单行注释,采用“#”或者或者“/”来进行标记,如下:来进行标记,如下:多行注释,和多行注释,和Java 语法完全一样,语法完全一样, 以以“/*”开始,以开始,以“*/”结束结束 ,如右图,如右图 :37严选课件函数函数 Drools 函数和函数和 javascript 方法几乎一样,以方法几乎一样,以 function 标记开头,如下:标记开头,如下: 可以在规则文件的任何位置定义函数,和可以在规则文件的任何位置定义函数,和javascript不同的是,函数体是用不同的是,函数体是用java代码代码
27、书写的。如下:书写的。如下:38严选课件函数的作用域函数的作用域 只不过,规则文件里定义的函数,作用域只能在只不过,规则文件里定义的函数,作用域只能在 本规则文件内有效,超出该规则范围,本规则文件内有效,超出该规则范围,就不能生效了。就不能生效了。 为了解决这一问题,通常在实际应用中,为了解决这一问题,通常在实际应用中, 使用使用java的静态方法,的静态方法,drools提供了一个特提供了一个特殊的殊的 import 语句:语句: import function;如下:;如下:39严选课件查询查询 在在 Drools 当中查询以当中查询以 query 关键字开始,以关键字开始,以 end 关
28、键字结束关键字结束主要作用是对主要作用是对 Working Memery里的里的fact对象进行统计及查询。对象进行统计及查询。无参查询格式:无参查询格式:实例如右图:实例如右图:有参查询格式:有参查询格式: 实例如右图:实例如右图: 40严选课件Drools高级语法部分高级语法部分41严选课件Agenda(议程)(议程)什么是议程当一个规则完全被匹配,一个Activation(活动)被创建,引用的规则和匹配的事实,被放置到议程中议程就是通过使用冲突解决策略控制这些活动的执行顺序冲突解决方案SalienceAgendaGroupActivationGroupRuleFlowGroup工作空工作
29、空间动间动作作议议程程计计算算42严选课件AgendaFilters(议程过滤器)(议程过滤器)运行或者阻止活动的引发Drools提供了一些开箱即用的过滤器也可以自定义过滤器,需实现AgendaFilter接口只允只允许许 规则规则名称名称为为“Hello World”的的规则执规则执行行43严选课件事件模式事件模式规则引擎事件用于通知规则引擎事件,包括引发规则,断言对象等等AgendaEventListener是引擎运行过程中Agenda管理调配规则发生的一些事件WorkingMemoryEventListener针对某个fact操作的监听器44严选课件事件模式事件模式WorkingMemo
30、ryEventListener45严选课件事件模式事件模式AgendaEventListener46严选课件编码规范建议编码规范建议 所有的规则文件(所有的规则文件(.drl )应统一放在一个规定的文件夹里面,如)应统一放在一个规定的文件夹里面,如(rules文件夹文件夹 )规则文件规则文件(.drl)的的 package 应和调用应和调用java的的 package一致。一致。 书写的每个规则,应尽量加上注释。注释要清晰明了,言简意赅书写的每个规则,应尽量加上注释。注释要清晰明了,言简意赅 。 同一类型的对象,尽量放在一个规则文件里,如所有同一类型的对象,尽量放在一个规则文件里,如所有Cus
31、tomer类型的对象,尽量放类型的对象,尽量放在一个规则文件里在一个规则文件里 。这样做的好处是:当。这样做的好处是:当WorkingMemery的的fact对象变化时,可以控对象变化时,可以控制规则的触发条件。制规则的触发条件。 同时,该对象的所有规则在同一个文件,也方便维护。同时,该对象的所有规则在同一个文件,也方便维护。 规则结果部分规则结果部分(RHS),尽量不要有条件语句,如,尽量不要有条件语句,如if(),尽量不要有复杂的逻辑和深层,尽量不要有复杂的逻辑和深层 次的嵌套语句;次的嵌套语句; 每条规则语句,最好都加上每条规则语句,最好都加上salience属性,第一条值最大,第二条次之,依次下去属性,第一条值最大,第二条次之,依次下去 每条规则执行结束,都应该加上打印日志的静态方法,此方法,统一封装提供。每条规则执行结束,都应该加上打印日志的静态方法,此方法,统一封装提供。 面对复杂的规则时,尽量使用面对复杂的规则时,尽量使用aganda-group组属性,同时,设置组属性,同时,设置lock-on-active为为trueDrools的默认的默认 dialect “java”,开发中,我们尽量避免使用,开发中,我们尽量避免使用dialect “mvel” 47严选课件谢谢谢谢48严选课件