【问题标题】:Drools Object Passing Issue in DRLDRL 中的 Drools 对象传递问题
【发布时间】:2018-06-12 15:00:50
【问题描述】:

我在这里遇到一个问题,在我在第一条规则上将对象设置为“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”?

【问题讨论】:

    标签: java drools rule


    【解决方案1】:

    在 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
    

    希望对你有帮助,

    【讨论】:

    • 嗨,当我添加修改功能时,规则是不断重新加载。文档中提到了修改用法,但我不太明白为什么它会一遍又一遍地重新加载所有内容。首先,重要的是要回顾一下为什么要使用上述模式。您可能有许多跨不同规则流组的规则。当规则修改工作内存和 RuleFlow 下游的其他规则(在不同的规则流组中)需要重新评估时,使用 modify 至关重要。但是,您不希望同一规则流组中的其他规则以递归方式将激活置于彼此之上。
    • insert 可能会导致对所有规则的评估,modify 将以相同的方式工作。修改事实后,将重新评估与该事实相关的所有规则(包括修改对象的相同规则)。这就是推理在 Drools(和其他规则引擎)中的工作方式。请注意,我已经修改了第一条规则中的条件,因此修改不会重新触发它。如果你不想让 Drools 知道修改,那么就不要使用modify 操作。
    • drools 中有更高级的功能,例如属性反应式,您也可以使用这些功能来避免重新执行规则。你可能想看看手册。
    • 这里不好。当我设法按照您的建议设置修改功能时。它在 eclipse 上完美运行,但运行 drool core api 6.0.1,但使用 swagger 和 Kie Server 在 drools core api 7.5 上运行失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多