更新功能如何在drools中工作?

时间:2013-01-24 17:54:09

标签: drools

更新功能如何在drools中运行?是否会导致相同的规则再次自动触发?

1 个答案:

答案 0 :(得分:14)

我认为您需要阅读手册:http://docs.jboss.org/drools/release/5.4.0.Final/drools-expert-docs/html_single/

使用update使规则引擎意识到事实已被修改。因此,必须重新评估依赖于该事实的规则。这确实会导致规则在无休止的循环中发射。例如,给定以下DRL,您将看到“无限循环”规则将连续激活:

declare AreWeThereYet
    answer : boolean
end

rule "Are we there yet?"
when
    not AreWeThereYet()
then
    insert(new AreWeThereYet());
end

rule "Infinite loop"
    no-loop
when
    $question: AreWeThereYet()
then
    $question.setAnswer(false);
    update($question);
end

这是因为update($question)已指示规则引擎,$question已更改,并且需要重新评估它。

但是有一些方法可以防止这种情况发生。只需将no-loop放在规则名称和when之间的行上,以防止规则因其自身后果而重新激活。另一个可以控制它的规则属性是lock-on-active