以下是 Drools 规则引擎中一些常见的语法和函数介绍:
规则语法结构
规则头部(rule)
java
rule "ruleName"
attributes
when
// 条件部分(LHS - Left Hand Side)
then
// 操作部分(RHS - Right Hand Side)
end
- “rule” 关键字:用于定义一条规则的开始,后面跟着规则的名称(ruleName),规则名称需要是唯一的,方便在规则库中对其进行标识和管理。
- “attributes” 部分:可以设置规则相关的属性,比如 “salience” 用于指定规则的优先级(数值越大优先级越高),示例:
salience 10
,还有 “no-loop” 属性用于避免规则的无限循环触发等情况,像no-loop true
。
条件部分(LHS - Left Hand Side)
- 模式匹配(Pattern Matching):
使用类似 Java 类的实例化语法结合约束条件来匹配事实(fact,即传入规则引擎的数据对象)。例如,假设有一个Person
类,里面包含age
和name
等属性,要匹配年龄大于 30 岁的人,可以这样写:
java
Person( age > 30 )
这里Person
就是事实类型,括号内是对该类型实例属性的约束条件,并且可以同时设置多个约束条件,用逗号隔开,如:Person( age > 30, name!= "John" )
,表示匹配年龄大于 30 岁且名字不是 “John” 的人。
- 逻辑连接词:
- “and”(与):用于连接多个条件,表示所有条件都要满足。例如:
java
Person( age > 30 ) and Person( name == "Alice" )
意味着要同时匹配年龄大于 30 岁并且名字是 “Alice” 的人这个事实情况。
- “or”(或):连接的条件中只要满足其中一个即可。例如:
java
Person( age > 30 ) or Person( name == "Bob" )
表示匹配年龄大于 30 岁或者名字是 “Bob” 的人就行。
- “not”(非):对某个条件进行取反,匹配不符合该条件的情况。例如:
java
not Person( age < 20 )
即匹配年龄不小于 20 岁的人这个事实场景。
- 存在性检查(Exists)和全称量词(Forall):
- “exists”:用于检查是否存在满足特定条件的事实。例如:
java
exists Person( age > 30 )
表示只要有年龄大于 30 岁的人这个事实存在就行,不管有几个这样的人。
- “forall”:表示对于所有符合某一条件的事实都要满足另外的条件。比如:
java
forall( Person( age > 20 ); Person( name!= "Tom" ) )
意思是对于所有年龄大于 20 岁的人,他们的名字都不能是 “Tom”。
操作部分(RHS - Right Hand Side)
在 “then” 后面的这部分是当 LHS 条件满足时要执行的操作,通常可以进行以下几种类型的操作:
- 修改事实对象属性:例如,如果还是前面的
Person
类事实对象,要修改匹配到的人的年龄,可以这样写:
java
Person( $p : age > 30 )
then
$p.setAge( $p.getAge() + 1 );
end
这里通过绑定变量($p
)的方式获取到匹配的事实对象,然后调用其方法来修改属性值。
- 插入新的事实对象:可以向规则引擎中插入新的事实,例如创建一个新的
Order
类的对象并插入,代码如下:
java
then
Order newOrder = new Order();
newOrder.setAmount(100.0);
insert(newOrder);
end
- 调用函数或方法:调用自定义的 Java 函数或者规则引擎提供的内置函数等,比如打印一些信息(使用
System.out.println
这个 Java 中的打印函数,在规则引擎中同样可以调用,前提是相关依赖已配置好):
java
then
System.out.println("规则被触发了");
end
函数
内置函数
- update:用于通知规则引擎某个事实对象已经被修改了,这样规则引擎会重新评估相关规则,看是否会因为这个事实的改变而触发其他规则。示例:
java
Person( $p : age > 30 )
then
$p.setAge( $p.getAge() + 1 );
update( $p );
end
- retract:从规则引擎中移除指定的事实对象,不再参与后续规则的匹配等操作。例如:
java
Person( $p : age > 60 )
then
retract( $p );
end
常用于当某个事实满足一定条件(比如达到某个过期、失效条件等)后将其从规则引擎中移除的场景。
- collect:用于收集满足特定条件的一组事实对象,常和集合相关操作配合使用。例如,收集所有年龄大于 20 岁的
Person
对象到一个列表中:
java
$persons : collect( Person( age > 20 ) )
then
// 可以对$persons这个集合进行后续操作,比如遍历等
for ( Person p : $persons ) {
System.out.println(p.getName());
}
end
自定义函数
除了使用内置函数外,还可以在 Drools 中定义自己的函数,这些函数通常是用 Java 语言编写,然后在规则中调用。例如,定义一个计算两个整数之和的函数:
在 Java 中(假设规则所在的项目中有对应的 Java 类用于存放这些函数定义):
java
public class MyFunctions {
public static int sum(int num1, int num2) {
return num1 + num2;
}
}
在规则中调用这个自定义函数:
java
rule "useCustomFunction"
when
// 条件部分
then
int result = MyFunctions.sum(3, 5);
System.out.println("两数之和为: " + result);
end
以上只是 Drools 语法和函数的一部分常见内容,实际应用中,根据不同的业务场景和数据模型,还可以进行更复杂和多样化的语法运用以及函数调用,以实现强大的业务规则处理能力。