Java DRL中的Drools对象传递问题

Java DRL中的Drools对象传递问题,java,drools,rule,Java,Drools,Rule,这里有一个问题,在第一条规则中将对象设置为“FAILED”后,但在运行第二条规则时,该值仍然指向原始值,即“PASS”。请注意,值是从kie客户端传递的 rule "1st rule" dialect "java" when $ruleEngine:RuleEngine() then OutputObject outputObject = new OutputObject(); outputObject.setResult("FAIL" )

这里有一个问题,在第一条规则中将对象设置为“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)为什么结果值设置为“失败”,但在“何时”检查期间运行第二条规则,那么结果值仍然为“通过”


问题2)如何在第二条规则“when”检查子句期间将结果值设置为“FAIL”

有一个特定的“函数”来修改Drools中的事实,而不是
insert
。在第一条规则中,您要做的是在会话中再次插入事实(造成混乱,流口水)。您需要的是
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

希望能有所帮助,

Drools中有一个特定的“函数”可以修改事实,而不是
insert
。在第一条规则中,您要做的是在会话中再次插入事实(造成混乱,流口水)。您需要的是
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

希望有帮助,

Hi,当我添加modify函数时,规则一直在重新加载。。文档中提到了修改用法,但我不太明白为什么它会一次又一次地重新加载所有内容。首先,回顾一下为什么要使用上述模式是很重要的。在不同的规则流组中可能有许多规则。当规则修改工作内存和规则流下游的其他规则(在不同的规则流组中)需要重新评估时,修改的使用至关重要。但是,您不希望同一规则流组中的其他规则以递归方式相互激活。同样,
插入
将可能导致对您的所有规则进行评估,
修改
也将以同样的方式工作。修改事实后,将重新计算与该事实相关的所有规则(包括修改对象的同一规则)。这就是Drools(和其他规则引擎)中推理的工作方式。请注意,我已在第一条规则中修改了条件,因此修改程序不会重新激发该条件。如果你不想让Drools知道修改的内容,那么就不要使用
modify
操作。Drools中有更高级的功能,比如属性reactive,你也可以使用它来避免规则的重新执行。你可能想看一下手册。这里不好。当我按照您的建议设置修改功能时。它在eclipse上运行得很好,但运行的是drool core api 6.0.1,但在drools core api 7.5上使用swagger和Kie Server时运行失败。嗨,当我添加修改函数时,规则是继续重新加载。。文档中提到了修改用法,但我不太明白为什么它会一次又一次地重新加载所有内容。首先,回顾一下为什么要使用上述模式是很重要的。在不同的规则流组中可能有许多规则。当规则修改工作内存和规则流下游的其他规则(在不同的规则流组中)需要重新评估时,修改的使用至关重要。但是,您不希望同一规则流组中的其他规则以递归方式相互激活。同样,
插入
将可能导致对您的所有规则进行评估,
修改
也将以同样的方式工作。修改事实后,将重新计算与该事实相关的所有规则(包括修改对象的同一规则)。这就是Drools(和其他规则引擎)中推理的工作方式。请注意,我已在第一条规则中修改了条件,因此修改程序不会重新激发该条件。如果你不想让Drools知道修改的内容,那么就不要使用
modify
操作。Drools中有更高级的功能,比如属性reactive,你也可以使用它来避免规则的重新执行。你可能想看一下手册。这里不好。当我按照您的建议设置修改功能时。它在eclipse上运行得很好,但运行的是drool core api 6.0.1,但在使用swagger和Kie Server的drools core api 7.5上运行失败。