1.什么是Drools引擎?
Drools引擎是Drools中的规则引擎。Drools引擎存储、处理和评估数据,以执行您定义的业务规则或决策模型。Drools引擎的基本功能是将传入的数据或事实与规则的条件相匹配,并确定是否和如何执行规则。
Drools中使用以下基础组件操作
1.规则器(rules):定义的业务规则或DMN决策。所有规则必须至少包含触发规则的条件和规则规定的操作。
2.事件规则(facts):输入或更改Drools引擎中与规则条件匹配以执行适用规则的数据。
3.生产存储器(Production memory:):规则存储在Drools引擎中的位置
4.匹配存在器(Working memory);事件存储在Drools引擎中的位置
5.执行器(Agenda):为准备执行而注册和排序激活规则的位置(如果适用的话)。
对新的数据和被修改的数据进行规则的匹配称为模式匹配( Pattern Matching )。进行匹配的引擎称为推理机( Inference Engine )。被访问的规则称为 ProductionMemory ,被推理机进行匹配的数据称为 WorkingMemory 。 Agenda 管理被匹配规则的执行。推理机所采用的模式匹配算法有下列几种: Linear , RETE , Treat , Leaps 。这里注意加红的地方,对数据的修改也会触发重新匹配,即对 WorkingMemory中的数据进行了修改。
规则文件 *.drl / *.xls(决策表)
*.drl文件
rule "ageUp12" when
$student: Student(age > 2)
then
$student.ageUp12();
end
rule "nameMax" when
$student: Student(name == "max")
then
$student.nameMax();
retract($student);
end
- package 定义了规则文件的一个命名空间,和java中的package无关。
- import 这里可以有多个,就是在规则文件里引用到的java类。
- rule 用来定义一个规则,这里名字不可重复,后面跟一个when关键字,翻译过来就是,规则 名ageUp12,当满足…
- when 和then之间是逻辑表达式,也就是辨别条件,其中 s t u d e n t : S t u d e n t ( a g e > 2 ) 这里其实包含了两个意思,一个是满足 a g e > 2 的 S t u d e n t 对象,一个是把这个对象赋值给 student:Student(age >2)这里其实包含了两个意思,一个是满足age>2的Student对象,一个是把这个对象赋值给 student:Student(age>2)这里其实包含了两个意思,一个是满足age>2的Student对象,一个是把这个对象赋值给student变量,这样后面就可以引用这个变量了。逻辑表达式写在小括号里,如果是多个条件,可以用逗号分隔,如$sutdent :Student(age > 2,name==“max”)
- then和end之间来定义action,即当满足age>2的时候,做什么操作,这里可以像在java方法里一样,调用任何一个java类的方法,只要import了这个类且在前面定义了这个变量
*.xls(决策表) (decisiontable)
决策表就是一个excel文件,可以是xls(xlsx暂不支持)或者csv是个表格,看上去也很直观,即便是不懂代码的人看了也能看懂,不像drl文件那么多语法。关键的一点是:decisiontable也是最终转成drl文件来让drools规则引擎来解析执行的
- 第一行,第一列:RuleSet 第二列。这里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()== p a r a m 则对应 d r l 里的 a g e = = 12 这里 param则对应drl里的age==12这里 param则对应drl里的age==12这里param是对应列每个单元格的值,然后这里需要特别说明下,针对于非字符串,如整数,小数等,可以直接使用$param,但是如果单元格里是字符串,则需要加双引号。(ps:mac里的双引号是斜的,一定要保证是竖着"的)另外,如果有多个值,可以用逗号隔开,然后可以用$1,$2提取变量值,如第一个ACTION里的student.doAction1($1,“$2”)
- 第八行仍然是注释行,可以添加每一个CONDITON ACTION列的说明。
下面的每一行就是对应的某些条件的取值了。