首页 > 解决方案 > 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”?

标签: javadroolsrule

解决方案


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

希望能帮助到你,


推荐阅读