Drools规则引擎实践直白总结

本文详细介绍了Drools规则引擎的实践总结,包括创建Drools环境、理解Drools语法、核心概念(LHS与RHS)以及规则的编写和执行。通过实例展示了Drools的规则编写、运行方式,并提出了自实现规则引擎的思路,帮助读者快速上手Drools。
摘要由CSDN通过智能技术生成

Drools规则引擎,网上大把相关的文章介绍,但我感觉不够直白,理解有些困难,且知识点没有集中比较分散、有些还是引版本的内容,对与新手来说上手可能比较慢,而且比较容易走弯路,故我在深入研究并实践于项目中后,在空闲时间花费精力整理了这篇文章,分享出来,便大家快速上手。

1. 创建Drools环境(引入Drools相关依赖包、现在都流行spring boot,故最简单有效的依赖才是最好的,kie-spring内部自行依赖了drools相关核心的依赖包)

        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <version>7.55.0.Final</version>
        </dependency>

2. 了解Drools语法及其含义(LHS、RHS、Fact)

  1. DRL文件基本格式:

    package rules.testwrod //包名,必需,这是逻辑上,与物理路径无关
    import xxxxx; //可选,导入要使用的类名(还支持直接导入静态方法)
    global java.util.List myGlobalList;//可选,定义全局变量(该变量由外部setGlobal传入)
    
    function getResult(...){ //可选,自定义函数
        
    }
    
    query "query_gt_0"(...) //可选,自定义查询(仅只有LHS内容)
    	$result:规则Pattern
    end
    
    rule “test001” //规则名称,必需,且需唯一
    when //规则开始关键字,必需
    //这里如果为空 则表示 eval(true); LHS内容(即:规则条件)
    then //规则条件结束关键字,必需,后面部份则是RHS内容(即:规则触发的逻辑)
    System.out.println(“hello drools!”);
    end //规则结束关键字
    
  2. 涉及的名词解释:

    1. LHS:条件部分又被称之为 Left Hand Side,简称为 LHS,在一个规则当中 when 与 then 中
      间的部分就是 LHS 部分。在 LHS 当中,可以包含 0~n 个条件,如果 LHS 部分没空的话,
      那么引擎会自动添加一个 eval(true)的条件,由于该条件总是返回 true,所以 LHS 为空的规https://www.jianshu.com/p/ccddaff7894a
      则总是返回 true。LHS涉及的匹配元素用法如下:

      • Pattern 模式,语法:事实类型(约束),其中约束是可选的,如:Person(age>18),意思是:匹配工作内存中是Person类型且age>18,若存在则为true,即命中该条规则;Pattern 模式支持多个,之间使用空格或换行即可;【通俗点:当前工作内存中有没有这个类型的对象(fact)】

      • 字段约束,即Pattern 模式中括号中的部份,一般有:单值限制(如:age>18)、复合值限制(Person(sex in (0,1)),注:暂支持in与not in)和多限制(如:age>18 && age<30 或 age ( (> 30 && < 40) || (> 20 && < 25) )) 3种限制模式;字段约束之间支持:||、&&、and、or、,(逗号即为AND)【通俗点:当前工作内中的这个类型(fact)的对象属性还需满足相关的约束条件】

      • 条件元素 eval,条件元素 eval 本实上是包罗万象的,它允许执行任何语义代码(返回一个 boolean 原型)【通俗点:动态解释执行代码逻辑,与js的eval有类似功能】

      • 条件元素 not,用于检查在工作内存中不存在某东西。把"not"看作“一定没有……”的意思

      • 条件元素 exists,用于检查在工作内存中存在某类型(fact)。把"exists"看作“至少有一个……”的意思。(如果匹配到多个事实fact对象,也只会触发执行一次RHS中逻辑)

      • 条件元素 forall,用于检查在工作内存中所有的对象(fact)都必需满足Pattern 模式,若有1个不满足,则为false,只有全部满足才为true;(如果匹配到多个事实fact对象,也只会触发执行一次RHS中逻辑)

      • 条件元素 from, 让用户指定任意的资源,用于 LHS 模式的数据匹配。这允许引擎在非工作内存数据的基础上进行推断。数据源可以是一个绑定变量的一个子字段,或者方法调用的结果。它是一个超强结构,允许开箱即可与其他应用程序组件或框架集成使用【通俗点:from后面是指定一个自定义的数据源,from前面是from后面结果得到的,类似sql中的select field=value from table;】

      • 条件元素 collect,允许规则在来自特定资源或工作内存的一个对象集合上进行推断【通俗点:就是将符合匹配到多个事实fact对象累加到一起形成一个Collection集合】

      • 条件元素 accumulate,是一个更灵活强大的 collect 形式,它主要做的事是允许规则迭代整个
        一个对象的集合,为每个元素定制执行动作,并在结束时返回一个结果对象, accumulate
        既支持预定义的累积函数的使用,或也可以使用内联的自定义代码,简化的语法如下:

        accumulate( <source pattern 源模式>; <functions 函数 > [;] ),其中函数除了内置的还可以自定义JAVA函数,只需使用import accumulate 类型(该类型需实现AccumulateFunction接口) 自定义方法名;

        示例代码:

        accumulate(Message(createBy=="zuowj",$id:id);$countNum:count($id);$countNum>1)
        //含义:查找工作内存中有Message类型的且过滤条件为(createBy=="zuowj")fact事实对象,并取出id,然后对所有的id进行count,最后判断count的结果是否>1,转换为SQL理解就是:
        //select id from Message where createBy='zuowj' group by id having count(id)>1;这样应该好理解吧!
        

        inline 的语法结构:
        from accumulate(

        ,init(),action(),reverse(),result() ):这个表示源模式。用法:也就是我们常用手 Object(xx:XX 属性) 这 个会去匹配每一个源对象。 :用法说明:init 是做初始化用的,简单的说,在 source pattern 遍历 完之后 就已经触发,有点像 for 的开头 : 用法说明:action 会执行所以满足条件的源对象进行操作,像是 for 的方法体。在里面可写 java code : 这是一个可选的被选方言的语义代码块,如果存在,将为不再匹配资 源模式的每个资源对象执行。这个代码块的目的是不做在 块中做的任何计算, 所以,当一个资源对象被修改或删除收时,引擎可能做递减计算,极大地提升了这些操作的 性能 : 返回值,是根据 action 上面两个遍历出来的结果进行一个返 回,这个返回值中也可以进行计算。 : 返回值类型,在返回值的类型再一次进行匹 配,如果匹配不成功则返回 false。

        示例代码:

        $res:String() from accumulate(Message(createBy=="zuowj",$cont:content),init(String allContent="";),action(allContent +=$cont;),result(allContent))
        //含义:for循环遍历工作内存中Message类型且过滤条件为(createBy=="zuowj")的fact对象,初始化设置allConten
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 规则引擎初步了解 5 1 为什么会有规则引擎? 5 2 什么是规则引擎? 5 3 为何要使用规则引擎? 6 3.1 声明式编程 6 3.2逻辑与数据分离 6 3.3 速度及可测量性 6 3.4 知识集中化 6 3.5 工具集成 6 3.6 解释机制 6 3.7易懂的规则 7 4 何时应当使用规则引擎? 7 5 如何使用规则引擎? 7 6 何时不要使用规则引擎 ? 8 7 规则引擎的架构和推理 8 8规则引擎的算法 10 9 Java规则引擎商业产品 10 10 Dools介绍 11 第二章. Drools 规则引擎 11 2.1. 概述 11 2.2. 编制 13 2.3. RuleBase 18 2.4. WorkingMemory 和有状态/无状态Sessions 22 2.5. StatefulSession 28 2.6. StatelessSession 29 2.7. Agenda 31 2.8. Truth Maintenance with Logical Objects 34 2.9. 事件模型(Event Model) 37 2.10. 顺序模式 41 第三章. 安装和设置(Core 与IDE) 42 3.1. 安装和使用 42 3.1.1. 依赖库 42 3.1.2. 运行时(Runtime) 43 3.1.3. 安装IDE (规则工作台) 43 3.2. 从源码进行安装 54 3.3. 源码Checkout 54 3.4. 构建 59 3.4.1. 构建源码 59 3.4.2. 构建使用手册 61 3.5. Eclipse 65 3.5.1. 产生Eclipse项目 65 3.5.2. 导入Eclipse项目 66 3.5.3. 导出IDE插件 71 3.5.4. 构建更新站点 76 第四章. 决策表 78 4.1. 在电子表格中的决策表 78 4.1.1. 何时使用决策表 78 4.1.2. 概述 79 4.1.3. 决策表如何工作 81 4.1.4. 关键字和语法 83 4.1.5. 基于决策表建立并集成电子表格 87 4.1.6. 在决策表中管理业务规则 88 第五章. 规则工作台 (IDE) 89 5.1. Introduction 89 5.1.1. 特性概要 90 5.1.2. 建立规则项目 90 5.1.3. 新建规则向导 92 5.1.4. 规则编辑器 94 5.1.5. 视图 95 5.1.6. 领域规范语言DSL 98 5.1.7. The Rete视图 100 5.1.8. 大容量DRL文件 101 5.1.9. 调试规则 102 第六章. 规则语言 103 6.1. 概述 103 6.1.1. 规则文件 103 6.1.2. 规则的构成 104 6.1.3. 保留字 104 6.2. Comments注释 106 6.2.1. 单行注释 106 6.2.2. 多行注释 106 6.3. Package 107 6.3.1. import 108 6.3.2. expander 108 6.3.3. global全局变量 108 6.4. Function 110 6.5. Rule 111 6.5.1. Rule 属性 112 6.5.2. LHS (when) 条件元素 115 6.5.3. The Right Hand Side (then) 140 6.5.4. 对自动封箱/拆箱以及元数据类型的注解 141 6.6. Query 141 6.7. Domain Specific Languages 领域特定语言 142 6.7.1. 何时使用DSL 142 6.7.2. 编辑与管理DSL 143 6.7.3. 在规则中使用DSL 144 6.7.4. 增加对fact的约束 145 6.7.5. DSL如何工作 146 6.7.6. 从头开始建立DSL 146 6.8. 规则流 147 6.8.1. 设置规则所属的规则流组 148 6.8.2. 简单的规则流 148 6.8.3. 如何建立规则流 148 6.8.4. 在你的应用程序中使用规则流 153 6.9. XML规则语言 153 6.9.1. 何时使用XML 153 6.9.2. XML 格式 154 6.9.3. 遗留的Drools 2.x XML 规则格式 159 6.9.4. Automatic transforming between formats (XML and DRL) 159 第七章:部署和测试 160 7.1. 部署选项 160 7.1.1. 使用RuleAgent部署 160 7.1.2. 使用drl源码部署 161 7.1.3. 在你的classpath中部署规则 161 7.1.4. 可部署的对象RuleBase, Package等等. 161 7.1.5. 部署模式 163 7.1.6. Web Services 166 7.1.7. 未来的构想 166 7.2. 测试 166 7.2.1. 测试框架 166 7.2.2. FIT for Rules – 一种规则测试框架 166 第八章. BRMS (业务规则管理系统) 168 8.1. 简介 168 8.1.1. 什么是BRMS? 169 8.1.2. 特性概要 170 8.2. 管理指南 170 8.2.1. 安装 171 8.2.2. 数据库配置 172 8.2.3. 安全性 173 8.2.4. 数据管理 176 8.3. 体系结构 178 8.3.1. 从源码构建 179 8.3.2. 可重用组件 180 8.3.3. 版本和存储库 180 8.3.4. 贡献 181 8.4. 快速使用指南 181 8.4.1. 快速使用指南 181 8.4.2. BRMS 概念 183 8.4.3. The business user perspective 197 8.4.4. 部署: 将规则与你的应用集成 197 8.5. 例子与教程 200 8.5.1. 保险经济折扣 200 第九章. Java规则引擎API 202 9.1 简介 202 9.2 java规则引擎API体系结构 202 9.3 规则管理API 202 9.4 运行时API 203 9.5 java规则引擎API的安全问题 204 9.6 异常与日志 205 9.7 JSR小结 205 9.8 Dools API 参考 205 9.8.1 简介 205 9.8.2. 如何使用 205 9.8.3. 参考书目 209
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值