什么是规则引擎?
- 规则引擎,全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System);
- 规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置和管理;
- 规则引擎的作用,根据预先制定的规则和事实匹配,对符合激发条件的规则,执行规则中定义的推理并作出相应的处理;
- 规则引擎主要由三部分组成,规则库(Knowledge base) + Working Memory(Fact base) + 推理机(规则引擎),规则引擎根据既定事实和规则库按照一定的算法执行推理逻辑得到正确的结果。
什么是Drools?
- Drools是一款基于JAVA的开源的规则引擎,使用基于Charles Forgy’s的 Rete 算法对所编写的规则求值,使用声明方式表达业务逻辑,实现了将业务决策从应用程序中分离出来的目标。
- Drools具有前向链接和后向链接推理的能力,允许快速可靠地评估业务规则和复杂的事件处理。
- Drools支持MVEL和JAVA两种语言,建议尽量少使用MVEL。
如何编写规则?
package 包路径名 // 包名必须定义的,必须放在规则文件第一行,经测试发现,需要和drl文件的存放路径保持一致
import XXX // 导入规则文件需要用到的外部规则文件、变量、类、类中的静态方法
rule "规则名"
// (属性部分,定义属性、设置规则执行的参数等)
salience 100
when
// 条件部分(条件可以单个,也可以多个,多个条件则写多行,多个条件之间可以是and也可以是or的关系)
// (满足什么样的条件),也叫作规则的 LHS(Left Hand Side)
then
// 结果部分
// (得到最终动作/结果),也叫作规则的 RHS(Right Hand Side)
end
如何开发?
获取KieServices -> 获取KieContainer -> 创建KieSession实例 -> 插入事实 -> 触发规则 -> 关闭KieSession
如何优化?
①. 规则拆分原则:将规则进行拆分,避免出现OR的情况
②. 规则比较原则:将区间或模糊查询的方式排在比较值的后面
③. 规则简单原则:尽量避免出现过于复杂比较值
④. 规则结果原则:then中避免出来if eles
注意和建议
①. 同一类型的对象/同一个JAVABEAN对应的规则,尽量放在一个规则文件里。这样做的好处是:当WorkingMemery的fact对象变化时,可以控制规则的触发条件。 同时,该对象的所有规则在同一个文件,也方便维护;
②. 每条规则语句,最好都加上salience属性;
③. 每条规则执行结束,都应该加上打印日志的静态方法,此方法应该统一封装提供;
④. 所有的规则文件(.drl)应统一放在一个规定的文件夹中,如:/rules文件夹
⑤. 书写的每个规则应尽量加上注释。注释要清晰明了,言简意赅
⑥. 规则结果部分(RHS)尽量不要有条件语句,如if(…),尽量不要有复杂的逻辑和深层次的嵌套语句
⑦. Drools默认dialect为"Java",尽量避免使用dialect “mvel”
⑧. 规则中条件字面量有==这样的比较符,要把这中最严格的放到前面所有条件的最前面
⑨. 在推理部分(LHS)不推荐使用if … then这样的条件判断语句,应该是明确的行为,因为条件判断应该在LHS中就已经明确区分出来了,如果推论部分存在条件判断的话,应该增加新的规则以满足业务需求。