文章目录
一、Drools规则引擎的中级语法
Package
-
package为规则包逻辑路径,当然在之前的文章中有提到过,为了管理方便及很好的阅读性最好和物理路径一致。
package
必须要放在规则文件的首行且在package的范围内还可以有import
、global
、funcation
、query
、rule
、EOF
。如果你觉得在每个规则文件中都去编写包路径,那么你可以这么做<kbase name="rules" packages="com.dr.drools" > <ksession name="hellodrools"/> </kbase>
Global
全局变量
-
全局变量是由
global class name
组成,这可以使我们能够更好的为规则提供数据,而且global
不同于Fact
对象被再次激活而影响到数据的变化。package com.dr.drools; dialect "mvel" global java.lang.Integer count rule "Global" when then count = 10; System.out.println(count); end
说明:
-
全局变量是一个公共的资源,如果你的规则中修改了全局变量的值,那并不会给其他规则造成影响因为这就像是
ThreadLoacl
线程副本一样,你只是修改了你规则中的这份副本值。通常这都是在定义常量和包装类时。 -
当我们定义全局变量为集合类或者
javaBean
时,在RHS 部分修改了全局变量的值时是会更改全局变量的数据,如果我们的规则相当多时,出现问题并不是我所想的那样。 -
如果想在代码中设置全局变量
KieServices kieServices = KieServices.Factory.get(); KieContainer kieContainer = kieServices.getKieClasspathContainer(); KieSession kieSession = kieContainer.newKieSession("hellodrools"); kieSession.setGlobal("globalName","value值");
-
Query
查询
- 从结构图中可以看到以
query
开始end
结束,name
为查询名称,括号内表示查询参数,可以是多个并且多个以逗号隔开。因为查询主要是设置查询条件故只在LHS中。
示例:
query "use query"(int $age)
$u: User(age == $age)
end
Function
函数
- 函数和
Java
的函数是类似的,只不过函数的开头需要以function
开始,同时函数可以是带参,也可以是有返回值的 - 如果你在规则文件外面编写了一个静态方法,你可以使用
import
进行导入 - 需要注意的是:在
when
中不能单独使用函数,必需使用eval()
关键字进行引用
import function