Drools 规则引擎
Drools 是 Java 编写的一款开源规则引擎,具有一个易于访问企业策略、易于调整以及易于管理的开源 业务规则引擎,符合业内标准,速度快、效率高。Drools 实现了 Rete 算法 对所编写的规则求值,支持 声明方式表达业务逻辑。使用 DSL(Domain Specific Language)语言来编写业务规则,使得规 则通俗易懂,便于学习理解。支持 Java 代码直接嵌入到规则文件中。
Drools 主要分为两个部分:
- 一是 Drools 规则,二是 Drools 规则的解释执行。
规则的编译与运行要通过 Drools 提供的相关 API 来实现。而这些 API 总体上游可分为三类:
- 规则编译、规则收集和规则的执行。
Drools 相关概念
Drools 通过事实、规则和模式相互组合来完成工作。
- 事实(Fact): 对象之间及对象属性之间的关系。
- 规则(rule): 是由条件和结论构成的推理语句,一般表示为 if…Then。
- if 部分称为 LHS (left-hand-side)
- then 部分称为 RHS (right hand side) - 模式(module): 模式是指的不能在继续分割下去的最小的原子条件。
FACT 对象
Fact 对象是指在使用 Drools 规则时,将一个普通的 JavaBean 对象插入到规则引擎的 WorkingMemory 当中的对象。规则可以对 Fact 对象进行任意的读写操作。Fact 对象不是对原来的 JavaBean 对象进行 Clone,而是使用传入的 JavaBean 对象的引用。规则在进行计算 时需要的应用系统数据设置在 Fact 对象当中,这样规则就可以通过对 Fact 对象数据的读写实现对应用数据的读写操作。
Fact 对象通常是一个具有 getter 和 setter 方法的 POJO 对象,通过 getter 和 setter 方法 可以方便的实现对 Fact 对象的读写操作,所以我们可以简单的把 Fact 对象理解为规则与应用系统数据交互的桥梁或通道。
规则文件
标准规则文件的结构如下:
package package-name
imports
globals
functions
queries
rules
rules: 定义一个条规则。rule “ruleName”。一条规则包含三部分:属性部分、条件部分 和结果部分。rule 规则以 rule 开头,以 end 结尾。
rule "name"
attributes
when
LHS # Left Hand Side
then
RHS # Right Hand Side
end
LHS 语法
LHS 是规则条件部分的 统称,由 0 个或多个条件元素组成。无条件,则为 true。
如果有多条规则元素,默认它们之间是“和”的关系,也就是说必须同时满足所有的条件 元素才会触发规则。
when
Pattern1()
and Pattern2()
then
... // actions
end
Pattern
# 匹配 Working Memory 中所有满足约束条件的 Person 对象。
Person( age == 50 ) # 等效于 Person( getAge() == 50 )
约束条件
优先级:&& > || > , # ',' 作用相当于 AND
Query
仅包含规则文件中的 LHS 部分,不用指定“when”和“then”部分。
query "query-1"
$person : Person(age > 30)
end
RHS 语法
RHS 的主要功能是对 working memory 中的数据进行 insert、update、delete 或 modify 操 作。
- modify 是基于结构化的更新操作
rule "modify stilton"
when
$stilton : Cheese(type == "stilton")
then
modify( $stilton ){
setPrice( 20 ),
setAge( "overripe" ) }
end
相关文档