JAVA 规则引擎 -- Drools
Drools 是一个基于 Java 的规则引擎,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。
知识点:
1、Drools 的基本工作过程:在 Drools 中,我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。这可以通过 Fact 对象来实现,Fact 对象是一个普通的 Java Bean,规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法。
2、Fact 对象:Fact 对象是一个普通的 Java Bean,规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法。当一个 Java Bean 插入到 workingMemory 中,规则使用的是原有对象的引用,规则通过对 Fact 对象的读写,实现对应用数据的读写,对于其中的属性,需要提供 getter setter 访问器。
3、规则文件:规则文件可以使用 .drl 文件,也可以是 xml 文件。在 Drools 中,规则语法需要定义 package,import,rule 等。
4、Package:package 是 Drools 规则文件中的一个必须定义的部分,必须放在规则文件第一行。 package 的名字是随意的,不必必须对应物理路径,跟 Java 的 package 的概念不同,这里只是逻辑上的一种区分。
5、Import:import 导入规则文件需要使用到的外部变量,这里的使用方法跟 Java 相同,但是不同于 Java 的是,这里的 import 导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。
6、Rule:rule 定义一个规则,一个规则可以包含三个部分:属性部分、条件部分和结果部分。属性部分定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等。条件部分,即 LHS,定义当前规则的条件。结果部分,即 RHS,这里可以写普通 Java 代码,即当前规则条件满足后执行的操作,可以直接调用 Fact 对象的方法来操作应用。
7、规则事例:规则事例可以定义规则的名称、规则的条件和结果。例如,rule "name" no-loop true when $message:Message(status == 0) then System.out.println("fit"); $message.setStatus(1); update($message); end
8、no-loop:no-loop 定义当前的规则是否不允许多次循环执行,默认是 false,也就是当前的规则只要满足条件,可以无限次执行。如果使用 no-loop true,即设置当前的规则,只执行一次,如果本身的 RHS 部分有 update 等触发规则重新执行的操作,也不要再次执行当前规则。
9、update:update 方法用于将当前的 workingMemory 中的 Fact 对象进行属性更新,这种操作会触发规则的重新匹配执行,可以理解为 Fact 对象更新了,所以规则需要重新匹配一遍。