关于 global 属性
- drl 文件中可以设置任意多个 global 对象, 语法是
global dataType variable
, dataType 不能 是int/double等原始类型. - global 作用: 用于Java和规则之间传递数据, 或者规则之间传递数据, 比如我们在 java 端将 outOfStockerProducts 传递到规则.
- global 对象可以通过 KieSession API 设置, 也可以在规则中设置, 就像是规则的普通变量一样.
- global 对象最好是通过KieSession API 设置设置, 这样能确保在pattern match之前就已ready.
- 在规则中修改 global 对象, 将影响后续规则和Java 对象, 下面是测试结果:
- 集合类型: 新值对Java代码和所有规则都生效.
- POJO: 新值对Java代码和所有规则都生效.
- Integer/Double等包装类型: : 新值对Java代码和所有规则都生效.
- int/double 类型: 不能用于 global 对象的定义.
包装类型的global对象影响范围测试代码
Drools drl 文件:
package com.sample.rules
import com.sample.Order;
global Double $totalCount ;
rule "rule1"
salience 2
when
$order:Order()
then
System.out.println("==============");
System.out.println("rule1 fired");
System.out.println("old $totalCount:" +$totalCount);
$totalCount=10D ;
System.out.println("$totalCount:" +$totalCount);
end
rule "rule2"
salience 0
when
$order:Order()
then
System.out.println("==============");
System.out.println("rule2 fired");
System.out.println("$totalCount:" +$totalCount);
end
测试Java类 代码:
package com.sample;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
/**
* This is a sample class to launch a rule.
*/
public class DroolsTest {
public static final void main(String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
Double globalValue = Double.valueOf(2.1);
kSession.setGlobal("$totalCount", globalValue);
System.out.println("old java code $totalCount:" + globalValue);
Order order = new Order();
kSession.insert(order);
kSession.fireAllRules();
globalValue = (Double) kSession.getGlobal("$totalCount");
System.out.println("==============");
System.out.println("java code $totalCount:" + globalValue);
kSession.dispose();
// System.out.println(order.getRealPrice());
} catch (Throwable t) {
t.printStackTrace();
}
}
}
测试运行效果: