java - DRL 中的 Drools 对象传递问题
问题描述
我在这里有一个问题,在我在第一条规则上将对象设置为“FAILED”但在运行第二条规则时,该值仍然指向原始值,即“PASS”。请注意该值是从 kie 客户端传递的。
rule "1st rule"
dialect "java"
when
$ruleEngine:RuleEngine()
then
OutputObject outputObject = new OutputObject();
outputObject.setResult("FAIL" );
$ruleEngine.setOutputObject(outputObject);
insert ($ruleEngine);
end
rule "2nd rule"
dialect "java"
when
$ruleEngine:RuleEngine(
( String.valueOf($ruleEngine.getOutputObject.getResult()).equals("PASS") ) //=====> the value is still PASS
)
then
System.out.println("output object==" + $ruleEngine.getOutputObject().getResult().equals("FAIL")); // ===> is true
System.out.println("output object:" + $ruleEngine.getOutputObject().getResult()); // ==> object is FAIL ?? Why?
end
规则的输出
output object==true
output object:FAIL
问题1)为什么结果值设置为“FAIL”但在“when”检查期间运行第二条规则,结果值仍然是“PASS”
问题 2)如何在第二条规则“when”检查子句中将结果值设置为“FAIL”?
解决方案
Drools 中有一个特定的“功能”来修改事实,而事实并非如此insert
。您在第一条规则中所做的是在会话中再次插入事实(导致 Drools 混淆)。您正在寻找的是modify
方法:
rule "1st rule"
dialect "java"
when
$ruleEngine:RuleEngine(outputObject!.result != "FAIL")
then
OutputObject outputObject = new OutputObject();
outputObject.setResult("FAIL" );
modify($ruleEngine){
setOutputObject(outputObject)
};
end
rule "2nd rule"
dialect "java"
when
$ruleEngine:RuleEngine( outputObject!.result == "PASS" )
then
//...
end
希望能帮助到你,
推荐阅读
- javascript - 验证并返回红色
- javascript - 在 React JS 的子组件中,道具的价值没有体现
- java - 请求处理失败;嵌套异常是 java.lang.ClassCastException:java.util.LinkedHashMap 无法转换为 MyClass
- django - 我是 Celery 和 Django 的新手,如何将 celery 响应的所有结果存储在一个文本文件中
- java - 及时测量数量[Java,多线程]
- android - Android剪贴板管理器未设置主剪辑
- xamarin.forms - iOS 是否有等效的 PeriodicWorkRequest 在后台使用?
- android - 带有 BottomNavigationView 的 ViewPager
- python - 如何在 Python 的 for 循环中分配变量
- python-3.x - 使用 xgboost/预测单个数据点将 id/index 与预测匹配