1、drools是什么
Drools是为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现。具有了OO接口的RETE,使得商业规则有了更自然的表达。
Rule是什么呢?
一条规则是对商业知识的编码。一条规则有 attributes ,一个 Left Hand Side ( LHS )和一个 Right Hand Side ( RHS )。Drools 允许下列几种 attributes : salience , agenda-group , no-loop , auto-focus , duration , activation-group 。
规则的 LHS 由一个或多个条件( Conditions )组成。当所有的条件( Conditions )都满足并为真时, RHS 将被执行。 RHS 被称为结果( Consequence )。 LHS 和 RHS 类似于
if(<LHS>){
<RHS>
}
下面介绍几个术语:
对新的数据和被修改的数据进行规则的匹配称为模式匹配( Pattern Matching )。进行匹配的引擎称为推理机( Inference Engine )。被访问的规则称为 ProductionMemory ,被推理机进行匹配的数据称为 WorkingMemory 。 Agenda 管理被匹配规则的执行。推理机所采用的模式匹配算法有下列几种: Linear , RETE , Treat , Leaps 。这里注意加红的地方,对数据的修改也会触发重新匹配,即对 WorkingMemory中的数据进行了修改。
然后规则引擎大概是这个样子的:
![](data:image/png;base64,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sJh63KLuRLjooovcjz/+mIlLW1ZX+9KmTTvXuvWmtkTtSwa6su0kjmR988037u2333bLly/3v2XLluUFg0Vmd9llF7fFFlu4Hj16ZMLawrIQmkoTFV5ge2mWLFmS6eGgMUPefPNN9/3332fKHrdDPXkxIYD77LOPa9u2bVwwnRMCWQgkZV08tFfSYGXdGh1UAAHalw8//NDZaEVInOKK06pVK784+s8//+zOPvvsTBBrXzix8847Z85XYqeu9mXx4s/czJl1t6O0L/zQlql9Kd6drCjJYshu1qz33MyZM7wGiOE7WDm9ALQ87dvv64455hiv1eFhh7WnUbsTkrzwhezVq1fsnbReFb0jyBfaO1Mx08tBS/fJJ5+4bbfd1h199NEeLzDjJxEChSLw+eefuzfeeMsdfXR337DccsstvjGio0IDk+t5xf7rtdde8RraE0880ZMpbLB4ZgcPHuSLY+96+/ZtM+k88MADmWeX8KYhpiORbwiTeAw/InSshg0bVmiVFa+KEeB5XrBggXvhhRd8+7J06VLfQe3UqZNvXxit4PkJtTs86+E3Og3wFLN9YSTm7rvv9to56k77AkZqXwp/EjarqampKTx63TGNMECg3nnnHff++++7efPm+V/v3r39zYNI0TNI28Ndd+1LGwJs586d6xsctpMnT3aHHHJI5oXgxYCc7rTTThXX5pUWidKlTuP/0ksvuVtvvbV0mZQg5b59+3qbrGeffbbeGiTI0tChQ/ywHnX+6aefHDZbbBHsqcaPH58pLcTplFNOcZ9++qkPxwXC8gwydM75f/zjHz48hM1ssiyNX/ziFz7s3nvv7Z/dMK927dq5V155xZM9y5B7AYmzcll+bF999dUMebPwadjecMMNfjhXWr7C7lbYvsyf/7HvsNMJpa05/PDD3WGHHeaOP/54tS+Fwet45+jQ0L7wTYCg7r///u6II47wmGL+QmdfbXdugEuiyeLGoJL9+9//7jUxDJXx0UUNSY9Yw125b0hDrtCDQbsQahhMHc6Lce+99/rk6J1Btvbcc0//YoThG5KfwqYPgTlz5niCTWMUJwxDmwYUuw0Esg6hGjVqlCfofGDPOOMM9/DDD2dptEaMGOGJ1I033pjRPNETPvLII306rVu3jssycw5S9cEHH3gNtZEktA+XXXaZ/6A/+uijbvTo0T78l19+6csA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gEhWU7vjqq8QKBECJ3dq4SBWJr0ipMvOaysEhIAQaCoIiGQ1lTutegqBEiPAZA6GDE367vl/bVdbISAEhECTREAkq0nedlVaCJQGgX59N00j11BhafBVqkJACKQLgdSTLDzT4uckrUL5bXpwWuugcgsBQ8DcrHTrunnGF5xd01YICAEh0NQQSLULh9dff92vf8iafVEHpo25kaTLiu8DBw5048ePb0xSdcYdO3asIz8880qqH4FqJ9Tbtahxv+2ymft/t9nGuf+7yq1e9y8brWq8u3VN7a/GOjfFOvGNjq7RZ+vyggcrjeTysVVJvPjesIqKVgip3F1INcmCCJ1//vlFJVh2K1auXJlZN9DOlWL7xz/+0R144IHu/vvvdxdddFEpslCaCUFgyJAhCSlJaYvBiguvvrLJ83Rpc6ps6nwjWC+0mB28ytZIucchwGhDv379HJ35Dh06+CCQrnPOOcd99dVX/rhnz55u2rRpcdGLcu75558vaKFrOgH33Xefw+E26xJKyo9AakkWpISP3LXXXlsy1Mwre8ky+OfaWCNGjHBXXnmlO+2007TEQSnBrnDafIQXLFig4eEK34diZM+3YcKECb7hEskqBqLJTePCCy90xx9/fBaZvvHGGz3BopN/4oknOtY2LJXccMMN7o477nDTp08vKItbb73VHXDAAerIF4Re4yOlkmTByiElgwYNyizgaVBwDe+7qElZhwo1ri3yadcsrG0Jy8/C2flcW9JhYWck39pPpPntt99mktlpp51i/QbxEtx5553+o3311VdnwmunuhBg6Qt6lhpiqo77yrtva6hWR41UiygCjzwyyS1cuNA99dRTWZdmzJjh2rVrV3JzEjJFk8Y6vKx/W4hgJ3nNNde4Sy+91A0YMKDe7VwheSlObQRSafg+bdrr/qE777zzsmqESvXYY4/1D+WvfvUr16lTJ39MIF4WepxxRvKTJm26lpVYzAGkiV5F9+7dfdqkf+SRR/q0o8FRJ5988sm+B0Evgh/HnI+T/fbbz40bN86rdeOu65wQEAJCQAiUF4Err/ydO/XUU7PWzaUN2XrrrX1BrIMeLRUdccgRP2y36hILS7yokBe/tWvXRi/5448//tjnwzaXjBw50l969NFHcwXR+RIhkEqS9V//9VcPR1RNP3/+fPfpp5861Lvvvvuua926tT8mMKuqL1my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)
这个图也很好理解,就是推理机拿到数据和规则后,进行匹配,然后把匹配的规则和数据传递给Agenda。
规则引擎实现了数据同逻辑的完全解耦。规则并不能被直接调用,因为它们不是方法或函数,规则的激发是对 WorkingMemory 中数据变化的响应。结果( Consequence ,即 RHS )作为 LHS events 完全匹配的 Listener 。
数据被 assert 进 WorkingMemory 后,和 RuleBase 中的 rule 进行匹配(确切的说应该是 rule 的 LHS ),如果匹配成功这条 rule 连同和它匹配的数据(此时就叫做 Activation )一起被放入 Agenda ,等待 Agenda 来负责安排激发 Activation (其实就是执行 rule 的 RHS ),上图中的菱形部分就是在 Agenda 中来执行的, Agenda 就会根据冲突解决策略来安排 Activation 的执行顺序。
下面附上drools规则引擎的执行过程
![](data:image/png;base64,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)
2、rete算法
rete在拉丁文里是net network的意思,这个算法由 Charles Forgy 博士在他的博士论文里提到。
这个算法可以分为两个部分,一个是如何编译规则,一个是如何执行。原话(The Rete algorithm can be broken into 2 parts: rule compilation and runtime execution.)
rule compilation 就是如何通过对所有规则进行处理,生成一个有效的辨别网络。而一个辨别网络,则对数据进行过滤,使数据一步步往下传送。数据刚进入网络,有很多的匹配条件,这里可以理解为:逻辑表达式为true or false,然后在网络里往下传递的时候,匹配的条件越来越少,最后到达一个终止节点。
在这个论文里Dr Charles描述了这么几个节点,Node:
![](https://images2015.cnblogs.com/blog/554589/201608/554589-20160813145707546-390274970.png)
这里对其中的几个节点做一下简单介绍,另外说一下如何运作的。
- 首先,root node是所有的对象都可以进入的节点,也是辨别网络的一个入口,这个可以理解为一个虚节点,其实可能并不存在。
- 然后立马进入到ObjectTypeNode节点,这是一个对象类型节点。很明显,这里承载的是一个对象,可以理解为是java中的某个new Object(),在这个算法里,这个节点的作用就是为了保证不做一些无用功,什么无用功呢,就是不是对每个规则,进入的对象都要去辨别一遍,而是确定的对象类型,去做跟他相关的辨别,其实就是match。那么怎么做到呢?这里用到了一个hashMap,每次进入网络的对象,都会在这个map中通过hash,找到一个对应的辨别路径去辨别,即match。附上英文原文:(
Drools extends Rete by optimizing the propagation from ObjectTypeNode to AlphaNode using hashing. Each time an AlphaNode is added to an ObjectTypeNode it adds the literal value as a key to the HashMap with the AlphaNode as the value. When a new instance enters the ObjectType node, rather than propagating to each AlphaNode, it can instead retrieve the correct AlphaNode from the HashMap,thereby avoiding unnecessary literal checks.)
一个图来说明:
![](data:image/png;base64,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)
所有经过ObjectTypeNode的对象都会走到下一个节点,下一个节点可以是下面的几种:AlphaNodes, LeftInputAdapterNodes and BetaNodes。后面两个节点是AlphaNodes节点的一些变种,AlphaNodes节点是用来判断一些条件的。可以理解为一些逻辑表达式的计算。
下面开始上图:
![](https://images2015.cnblogs.com/blog/554589/201608/554589-20160813145752734-1032542797.png)
- 这个图就是传递进一个Cheese对象,然后依次判断是否满足条件:1.判断name是否是“cheddar”,2.如果判断1通过了,继续判断strength是否是strong。这是最简单了一种情况了,这里附上对应的规则描述,后面会继续讲解:
rule "cheessRule" when
$cheese:Cheese(name == "cheddar" && strength == "strong")
then
......
end
3、maven依赖
这里列了一些后面的一些例子需要用到的maven依赖
<!--kie api 构建kie虚拟文件系统,关联decisiontable和drl文件,很关键 --><dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
</dependency>
<!-- 规则引擎核心包,里面包含了RETE引擎和LEAPS 引擎-->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
</dependency>
<!-- 决策表依赖-->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-templates</artifactId>
</dependency>4、规则文件:drl or xls
我们一般用到的也就这两种形式,一个是drl文件,是drools规则引擎提供的最原生的方式,语法很简单,具体语法见drools语法介绍
还有一个是决策表,决策表可以是xls也可以是csv,我们一般用xls比较多。而且好理解。xls就是一个excel文件。ps:在使用的过程中,遇到很多坑,其中一个最大的坑是mac系统的问题,这里后面会安利。
4.1 drl文件
举例:
package com.sankuai.meituan.maxtse.drools.test
import com.sankuai.meituan.maxtse.drools.po.Student
rule "ageUp12" when
$student: Student(age > 2)
then
$student.ageUp12();
end
rule "nameMax" when
$student: Student(name == "max")
then
$student.nameMax();
retract($student);
end简单说明:以第一个rule为例
- package 定义了规则文件的一个命名空间,和java中的package无关。
- import 这里可以有多个,就是在规则文件里引用到的java类。
- rule 用来定义一个规则,这里名字不可重复,后面跟一个when关键字,翻译过来就是,规则 名ageUp12,当满足......
- when 和then之间是逻辑表达式,也就是辨别条件,其中$student:Student(age >2)这里其实包含了两个意思,一个是满足age>2的Student对象,一个是把这个对象赋值给$student变量,这样后面就可以引用这个变量了。逻辑表达式写在小括号里,如果是多个条件,可以用逗号分隔,如$sutdent :Student(age > 2,name=="max")
- then和end之间来定义action,即当满足age>2的时候,做什么操作,这里可以像在java方法里一样,调用任何一个java类的方法,只要import了这个类且在前面定义了这个变量
第二个例子可以看到有个retract($student),这里是用到了drools内部提供的一个函数。
4.2、excel文件
决策表就是一个excel文件,可以是xls(xlsx暂不支持)或者csv是个表格,看上去也很直观,即便是不懂代码的人看了也能看懂,不像drl文件那么多语法。关键的一点是:decisiontable也是最终转成drl文件来让drools规则引擎来解析执行的。*.xls到*.drl的转换这个在后面的wiki会说到。
直接上图吧
这里可以暂时忽略那些背景色,只是为了好区分没个模块的作用
这里忽略文件开始的空行,从有数据的第一行开始解释说明:
第一行,第一列:RuleSet 第二列com.sankuai.meituan.maxtse.drools.test。这里RuleSet可以省略的,累似drl文件中的package
第二行,第一列:Import 第二列具体的java类,这里和drl文件里的Improt相对应,多个引用类用逗号分隔
第三行,是个对这个决策表的说明
第四行,第一列:RuleTable FirstDecisionTable 这一行很关键 指明这是一个决策表,并且下面的几行都是具体的规则,就好比上面几行是一些准备条件,下面才是真正干活的地方,这里来个说明
第五行,CONDITION行,这一行可以有两种列名:CONDITION ACTION。CONDITION列就是drl里的辨别条件, ACTION则是具体的操作,即满足前面几列的CONDITION的条件后,会执行什么操作,这里CONDITION一定在ACTION前面,ACTION可以有多个列, 单个ACTION里的多个操作用逗号分隔,末尾要加分号结尾这里很重要,不然会有解析错误
第六行,紧挨着CONDITION的一行,可以在这里声明下面要用的到对象,对应drl文件里的$student:Student()
第七行,是辨别条件逻辑表达式,如:student.getAge()==$param则对应drl里的age==12这里$param是对应列每个单元格的值,然后这里需要特别说明下,针对于非字符串,如整数,小数等,可以直接使用$param,但是如果单元格里是字符串,则需要加双引号。(ps:mac里的双引号是斜的,一定要保证是竖着"的)另外,如果有多个值,可以用逗号隔开,然后可以用$1,$2提取变量值,如第一个ACTION里的student.doAction1($1,"$2")
第八行仍然是注释行,可以添加每一个CONDITON ACTION列的说明。
下面的每一行就是对应的某些条件的取值了。