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

下载本文档

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

文档简介

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来实现 这些API总体来讲可以分为三类:规则编译、规则收集和规则的执行 主要有KnowledgeBuilder、KnowledgeBase、StatefulKnowledg

4、eSession、StatelessKnowledgeSession等 它们起到的作用主要是对 规则文件进行收集、编译、查错、插入fact、设置global、执行规则或规则流等,11,严选课件,一个简单的例子,Drools的API之 KnowledgeBuilder的作用 用来在业务代码当中收集已经编写好的规则, 然后对这些规则文件进行编译, 最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用。 Drools的API之 KnowledgeBase的作用 用来收集应用当中知识(knowledge) ,在一个KnowledgeBase 当中可以包含普通的规则(rul

5、e)、规则流(rule flow)、函数定义(function)、用户自定义对象(type model) 等 KnowledgeBase本身不包含任何业务数据对象(fact对象:JavaBean set到Working Memory后的对象) 业务数据对象(fact对象)都是插入到由KnowledgeBase产生的两种类型的session 对象当中(StatefulKnowledgeSession和StatelessKnowledgeSession),12,严选课件,一个简单的例子,Drools的API之 statefulKnowledgeSession作用: 规则编译完成之后,编译好的规则包

6、文件在规则引擎当中运行起来,StatefulKnowledgeSession主要作用是对规则引擎进行交互。 StatefulKnowledgeSession 可以接受外部插入(insert)的业务数据也叫fact 使用完StatefulKnowledgeSession 对象之后, 一定要调用其dispose()方法 fireAllRules()方法触发所有的规则执行,13,严选课件,一个简单的例子,Fact对象(这个概念很重要,后面会陆续出现) 一个普通的JavaBean 插入到规则的WorkingMemory当中 后的对象。 当 Fact对象插入到WorkingMemory当中后,会与当前W

7、orkingMemory当中所有的规则进行匹配,同时返回一个FactHandler对象。 FactHandler 对象是插入到WorkingMemory当中Fact对象的引用句柄。 FactHandler 对象可以实现对对应的Fact 对象的删除及修改等操作。 规则主要是对fact对象进行操作, fact是 规则与应用系统交换数据的桥梁,14,严选课件,规则语言基础,15,严选课件,规则文件,一个标准的规则文件就是一个以“.drl”结尾的文本文件 Packages和java的package差不多 Imports和java的import一样 Globals全局变量的声明 Functions函数的

8、声明,和javascript的函数声明差不多 Queries,查询用 Rules ,规则,16,严选课件,什么是规则,一个规则(rule)由规则名称、属性部分(attributes)、条件部分LHS(left hand side)和结果部分LHS(left hand side) 组成 当所有的LHS(left hand side)匹配,rule可能“fire” 规则(rule)操纵应用程序中的数据(fact),17,严选课件,Rule格式,18,严选课件,条件部分LHS,可以包含 0n 个条件 条件部分为空,引擎会自动添加一个eval(true),该条件返回为true,如: 条件又称之为 pa

9、ttern(匹配模式),多个 pattern之间用可以用 and 或 or 连接 Pattern(匹配模式)语法如下: $customer是绑定变量名,age30是约束条件,其中变量绑定变量名:和field约束都是可以省略的。,19,严选课件,约束条件,采用 “&”(and)、”|”(or)、和”,”(and)来实现对象内部多个约束 在没有用小括号的情况下,优先级是: “&”(and)、”|”(or)、和”,”(and),如下: 符合条件的Customer对象,要么是age20的,要么是gender=male且city=sh的 ”,” 不能与 “&”和”|” 混合使用。,20,严选课件,比较操

10、作符,Drools5提供了12种类型的比较操作符,分别是: 、 =、 、 =、 = =、 !=、 contains、 not contains、memberof、not memberof、matches、not matches 前6种使用比较多,后面的几种的使用,简单介绍下。,21,严选课件,比较操作符(contains和not contains),contains 是用来检查一个 Fact 对象的某个字段(该字段要是一个 Collection或是一个 Array 类型的对象)是否包含一个指定的对象。 格式: not contains正好和contains的功能相反。,22,严选课件,比较操作

11、符(memberof和not memberof),memberOf 是用来判断某个 Fact 对象的某个字段是否在一个集合(Collection/Array)当中。 格式: . not memberof的功能正好和memberof的相反,23,严选课件,比较操作符(matches和not matches),matches 是用来对某个 Fact 的字段与标准的 Java 正则表达式进行相似匹配。 格式: not matches正好和maches的功能相反。,24,严选课件,结果部分(RHS),只有在 LHS 的所有条件都满足时 RHS 部分才会执行. 在 RHS 当中可以使用 LHS 定义的绑

12、定变量名, 设置的全局变量、或者是直接编写 Java 代码。 RHS 虽然可以直接编写 Java 代码,但不建议在代码当中有条件判断,如果需要条件判断,请重新考虑将其放在 LHS 当中,否则就违背了使用规则的初衷。 在 RHS 里面,提供了一些对当前 Working Memory 实现快速操作的宏宏函数或对象 比如 insert/insertLogical、 update 和 retract 就可以实现对当前 Working Memory中的 Fact 对象进行新增、删除或者是修改。 Drools 还提供了一个名为 kcontext 的宏对象。 Kcontext的宏对象直接访问当前 Worki

13、ng Memory 的 KnowledgeRuntime,25,严选课件,Insert宏函数,Java 类中 StatefulKnowledgeSession 对象的 insert 方法的作用相同。 都是用来将一个 Fact 对象插入到当前的 Working Memory 当中 基本格式: 注意: 一旦调用 insert 宏函数,那么 Drools 会重新与所有的规则再重新匹配一次,对于没有设置 no-loop=true 的规则,如果条件满足,不管其之前是否执行过都会再执行一次。 update、retract 宏函数同样具有该特性。 可以这么理解,在调用insert 、update、retra

14、ct宏函数时,会自动的用 fireAllRules()方法触发所有的规则执行 。 使用实例如右图:,26,严选课件,Update 宏函数,用来实现对当前 Working Memory 当中的 Fact 进行更新。 有两种用法形式 (1) 直接更新一个 Fact 对象,格式: (2) 通过指定 FactHandle 来更新对应的 Fact 对象。,27,严选课件,Update 宏函数,FactHandle 来更新对应的 Fact 对象实例:,28,严选课件,retract宏函数,用来将 Working Memory 当中某个 Fact 对象从 Working Memory 当中删除。 使用格式:

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

16、、modify需要注意的地方,(1)它们都能使Working Memery里的fact对象发生变化。 (2)都会自动调用fireAllRules()方法,自动触发规则的执行。 (3)触发规则时,若no-loop=true,新改变的fact对象,会对非自身的其它的所有规则重新匹配一次。 (4)触发规则时,若no-loop=false,新改变的fact对象,会对所有规则(包括自身)重新匹配一次。 (5)触发规则时,匹配的原则是:新改变的fact对象 只去匹配 条件包涵有fact对象的规则表达式 。 (6)no-loop属性,只是针对 自身触发的规则有用。 注意用好此属性,避免死循环,32,严选课件

17、,属性部分,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,

18、表示规则是否可用,默认为true,值为false,表示该条规则不可用。 dialect,用来定义规则当中要使用的语言类型, Drools5 目前支持两种方言,分别是mvel 和 java,默认值为java,33,严选课件,属性部分(activation-group),该属性的作用是将若干个规则划分成一个组,用一个字符串来给这个组命名,这样在执行的时候,具有相同 activation-group 属性的规则中只要有一个会被执行,其它的规则都将不再执行。 该属性的特点:规则进行分组,同组成员互斥,只有一个规则能执行成功。 同组成员规则的执行顺序,非常像ifelse ifelse if 的结构 使用

19、该规则,有一点要特别注意:每个执行成功的规则,只能成功的匹配一次,34,严选课件,属性部分(agenda-group ),这个属性非常重要 此属性的作用也是对规则进行分组,拥有该属性组的规则,需要用户手动激活才能执行该组的所有规则。 该属性的特点是:规则分组,手动激活,按优先级顺序执行所有规则。,35,严选课件,属性部分(lock-on-active),这个属性也非常重要 当规则使用 *-group组属性时,如agenda-group、activation-group,在lock-on-action设置为true,可以避免因某些Fact对象被修改而导致已经执行过的规则再次被激活执行。 此属性的

20、特点:只能配合*-group组属性一起使用, 是no-loop属性的升级版,只不过,no-loop属性管理着单个规则,而lock-on-active管理着规则组。,36,严选课件,注释,在 Drools当中注释的写法与编写 Java 类的注释的写法完全相同,写法分两种: 单行注释与多行注释 单行注释,采用“#”或者“/”来进行标记,如下: 多行注释,和Java 语法完全一样, 以“/*”开始,以“*/”结束 ,如右图 :,37,严选课件,函数,Drools 函数和 javascript 方法几乎一样,以 function 标记开头,如下: 可以在规则文件的任何位置定义函数,和javascrip

21、t不同的是,函数体是用java代码书写的。如下:,38,严选课件,函数的作用域,只不过,规则文件里定义的函数,作用域只能在 本规则文件内有效,超出该规则范围,就不能生效了。 为了解决这一问题,通常在实际应用中, 使用java的静态方法,drools提供了一个特殊的 import 语句: import function;如下:,39,严选课件,查询,在 Drools 当中查询以 query 关键字开始,以 end 关键字结束 主要作用是对 Working Memery里的fact对象进行统计及查询。 无参查询格式: 实例如右图: 有参查询格式: 实例如右图:,40,严选课件,Drools高级语法部分,41,严选课件,Agenda(议程),什么是议程 当一个规则完全被匹配,一个Activation(活动)被创建,引用的规则和匹配的事实,被放置到议程中 议程就是通过使用冲突解决策略控制这些活动的执行顺序 冲突解决方案 Salience AgendaGroup ActivationGroup RuleFlowGroup,工作空间动作,议程计算,42,严选课件,AgendaFilters(议程过滤器),运行或者阻止活动的引发 Drools提供了一些开箱即用的过滤器 也可以自定义过滤器,需实现AgendaFilter接口,只允许 规则名称为

温馨提示

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

评论

0/150

提交评论