- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
决策表转换成的Drools规则语言
展开查看详情
1 . 为什么要使用规则引擎 • 传统的 if…else 使程序逻辑混乱,可调试性和可维护性非常 差。 • 业务规则与程序代码分离,可维护性非常好。 • 高效的规则匹配算法,提高了代码执行效率。 1 / 21 流程指引 过程监控 推动改进 生产高质软件
2 . Drools 简介 • Jboss 的开源项目 • 全 Java 开发的,可以很好的 java 项目结合 • 采用了 Rete 规则匹配算法,规则匹配效率高 • 拥有简单易用的规则语法 • 有强大的社区支持 2 / 21 流程指引 过程监控 推动改进 生产高质软件
3 . Drools 规则实例 过生日,积分加 10 分,并且将当月交易翻倍后再计算积分 package com.drools.demo.point import com.drools.demo.point.PointDomain; rule birthdayPoint // 过生日,则加 10 分,并且将当月交易翻倍后再计算积分 salience 100 lock-on-active true when $pointDomain : PointDomain(birthDay == true) then $pointDomain.setPoint($pointDomain.getPoint()+10); $pointDomain.setBuyNums($pointDomain.getBuyNums()*2); $pointDomain.setBuyMoney($pointDomain.getBuyMoney()*2); $pointDomain.setBillThisMonth($pointDomain.getBillThisMonth()*2); end 3 / 21 流程指引 过程监控 推动改进 生产高质软件
4 . Drools 语法 package :对一个规则文件而言, package 是必须定义的,必须放在规则文 件第一行。特别的是, package 的名字是随意的,不必必须对应物理路 径,跟 java 的 package 的概念不同,这里只是逻辑上的一种区分。同样 的 package 下定义的 function 和 query 等可以直接使用。 import :导入规则文件需要使用到的外部变量,这里的使用方法跟 java 相 同,但是不同于 java 的是,这里的 import 导入的不仅仅可以是一个类, 也可以是这个类中的某一个可访问的静态方法。 rule :定义一个规则。 rule "ruleName" 。一个规则可以包含三个部分: 属性部分:定义当前规则执行的一些属性等,比如是否可被重复执行、过期 时间、生效时间等。 条件部分,即 LHS ,定义当前规则的条件,如 when Message(); 判断当前 workingMemory 中是否存在 Message 对象。 结果部分,即 RHS ,这里可以写普通 java 代码,即当前规则条件满足后执 4 / 行的操作,可以直接调用 21 流程指引 过程监控 Fact 推动改进 对象的方法来操作应用。 生产高质软件
5 . Drools 语法 no-loop : 定义当前的规则是否不允许多次循环执行,默认是 false ,也就是 当前的规则只要满足条件,可以无限次执行。 lock-on-active true :通过这个标签,可以控制当前的规则只会被执行一 次,因为一个规则的重复执行不一定是本身触发的,也可能是其他规则触 发的,所以这个是 no-loop 的加强版。当然该标签正规的用法会有其他的 标签的配合,后续提及。 date-expires :设置规则的过期时间,默认的时间格式:“日 - 月 - 年”,中英 文格式相同,但是写法要用各自对应的语言,比如中文: "29- 七月 -201 0" ,但是还是推荐使用更为精确和习惯的格式,这需要手动在 java 代码 中设置当前系统的时间格式,后续提及。属性用法举例: date-expires "2 011-01-31 23:59:59" // 这里我们使用了更为习惯的时间格式 date-effective :设置规则的生效时间,时间格式同上。 duration :规则定时, duration 3000 3 秒后执行规则 5 / 21 流程指引 过程监控 推动改进 生产高质软件 salience :优先级,数值越大越先执行,这个可以控制规则的执行顺序。
6 . drools Decision Table( 决策表 ) • 何时使用决策表——如果规则能够被表达为模板 + 数据的格式,那你 应该考虑使用决策表。决策表中的每一行就是对应模板的一行数据, 将产生一个规则。 • 运行决策表—— Drools 引擎所部署的系统中执行决策表。首先,决策 表转换成的 Drools 规则语言( DRL ),然后执行规则引擎需求。这 意味着它是可能的业务规则的变更,无需停止和启动,或重新部署任 何软件。 6 / 21 流程指引 过程监控 推动改进 生产高质软件
7 . drools Decision Table( 决策表 ) 7 / 21 流程指引 过程监控 推动改进 生产高质软件
8 . Drools 组件 Drools 是业务逻辑集成平台,被分为 4 个项目: Drools Guvnor (BRMS/BPMS) :业务规则管理系统 Drools Expert (rule engine) :规则引擎, drools 的核心部分 Drools Flow (process/workflow) :工作流引擎 Drools Fusion (cep/temporal reasoning) :事件处理 8 / 21 流程指引 过程监控 推动改进 生产高质软件
9 . Drools 规则流 JBoss 规则引擎已经提供了一些功能来定义规则的执行顺序,例 如 salience 、 activation groups 等等。当处理海量的规则 时,管理规则激发的顺序会变得很复杂。规则流允许你指定一 个规则评估的流程。这允许你指定哪些规则应该按照先后顺序 或并发的评估,指定规则评估的先决条件等等。 9 / 21 流程指引 过程监控 推动改进 生产高质软件
10 . Drools 规则流 10 / 21 流程指引 过程监控 推动改进 生产高质软件
11 . Drools 规则流 11 / 21 流程指引 过程监控 推动改进 生产高质软件
12 . Drools 事件 从 drools 视图来看,事件就是一个特殊的事实( fact )。我们 说,所有的事件都是事实,但是所有的事实并不都是事件。 • 通常不可变 : 事件是在应用程序域中状态改变的记录。 • 强时间约束:规则涉及的事件通常需要多个事件的相互关系,尤其某个事 件相对其他事件发生的时间点的时间关系。 • 可管理的生命周期:由于上两个事件特征的原因,事件通常在一个有限的 时间窗( Time Window )匹配事件和事实。 • 滑动窗( sliding windows )的使用:由于所有的事件都有关联的时间 戳,可以定义并使用滑动窗,让事件在特定的一段时间有效。 12 / 21 流程指引 过程监控 推动改进 生产高质软件
13 . Drools 事件 $eventA : EventA( this before[ 3m30s, 4m ] $eventB ) 也就是: 3m30s <= $eventB.startTimestamp - $eventA.endTimeStamp <= 4m $eventA : EventA( this after[ 3m30s, 4m ] $eventB ) 也就是: 3m30s <= $eventA.startTimestamp - $eventB.endTimeStamp <= 4m $eventA : EventA( this meets $eventB ) 也就是: abs( $eventB.startTimestamp - $eventA.endTimestamp ) == 0 13 / 21 流程指引 过程监控 推动改进 生产高质软件
14 . Drools 专家系统 RBES 包括三部分: • Rule Base ( knowledge base ) • Working Memory ( fact base ) • Inference Engine 。 引擎包括三部分: • 模式匹配器( Pattern Matcher ) • 议程( Agenda ) • 执行引擎( Execution Engine ) 14 / 21 流程指引 过程监控 推动改进 生产高质软件
15 . Drools 专家系统 15 / 21 流程指引 过程监控 推动改进 生产高质软件
16 . Java 规则引擎的结构示意图 16 / 21 流程指引 过程监控 推动改进 生产高质软件
17 . RETE 算法 相关概念: ( 1 )事实( Fact ):对象之间及对象属性之间的关系 ( 2 )规则( rule ):是由条件和结论构成的推理语句,一般表示为 if... Then 。一个规则的 if 部分称为 LHS , then 部分称为 RHS 。 ( 3 )模式( module ):就是指 IF 语句的条件。这里 IF 条件可能是有 几个更小的条件组成的大条件。模式就是指的不能在继续分割下去的 最小的原子条件。 17 / 21 流程指引 过程监控 推动改进 生产高质软件
18 . RETE 算法 RETE 推理网络的生成过程: 简单点说,就是从规则集 { 规则 1 ,规则 2........} 中拿出一条来,根据一定算法, 变成 RETE 推理网络的节点。不断循环将所有规则都处理完, RETE 推理网络 就生成了。 这里的一定算法具体过程如下: 1 、创建 root 节点(根节点),推理网络的入口。 2 、拿到规则 1 ,从规则 1 中取出模式 1 (前面说了,模式就是最小的原子条件, 所以规则模式的关系是 1 : n )。 a) 检查模式 1 中的参数类型,如果是新类型,添加一个类型节点。 b) 检查模式 1 对应的 Alpha 节点是否存在,如果存在记录下节点的位置;如果 没有,将模式 1 作为一个 Alpha 节点加入到网络中。同时根据 Alpha 节点建立 Alpah 内存表。 c) 重复 b ,直到处理完所有模式。 d) 组合 Beta 节点: Beta(2) 左输入节点为 Alpha(1) ,右输入节点为 Alpha(2) Beta(i) 左输入节点是 Beta(i-1), 右输入节点为 Alpha(i) e) 重复 d ,直到所有 Beta 节点处理完毕 f) 将动作 Then 部分封装成最后节点做为 Beta ( n ) 3 、重复 2 ,直到所有规则处理完毕 18 / 21 流程指引 过程监控 推动改进 生产高质软件
19 . RETE 算法 19 / 21 流程指引 过程监控 推动改进 生产高质软件
20 . RETE 算法 20 / 21 流程指引 过程监控 推动改进 生产高质软件
21 . 谢谢 21 / 21 流程指引 过程监控 推动改进 生产高质软件