Drools:针对同一案例触发两次规则
Drools: Rule firing twice for the same case
虽然只有一个匹配案例,但此规则会触发两次。我使用 Drools 6.5.0。最后。看log,第二轮取$card2为$card1,反之亦然
rule "Rule1"
salience 1
when
$card1 : (used == false)
$card2 : (used == false, number = $card1.number)
exists Hand(name == name1)
exists Hand(name == name2 || name == name3)
not Hand(name == name4)
then
$card1.setUsed(true); $card2.setUsed(true);
insert(new Hand(name1, $card1, $card2));
end
首先,我觉得你的规则格式不正确。前 2 个模式缺少它们的类型,并且存在并非来自任何地方的变量(即 name1
)。
其次,请记住 Drools 中规则的 LHS 有点像 SQL 语句。如果您未指定模式之间的任何关系,将使用它们的笛卡尔积。
希望对您有所帮助
规则的 No-Loop 属性确保当在 then 语句中更新/修改 when 条件中使用的相同对象时,不会重新触发相同的规则。
定义无循环的方式如下:
rule "Rule1"
no-loop true
虽然只有一个匹配案例,但此规则会触发两次。我使用 Drools 6.5.0。最后。看log,第二轮取$card2为$card1,反之亦然
rule "Rule1"
salience 1
when
$card1 : (used == false)
$card2 : (used == false, number = $card1.number)
exists Hand(name == name1)
exists Hand(name == name2 || name == name3)
not Hand(name == name4)
then
$card1.setUsed(true); $card2.setUsed(true);
insert(new Hand(name1, $card1, $card2));
end
首先,我觉得你的规则格式不正确。前 2 个模式缺少它们的类型,并且存在并非来自任何地方的变量(即 name1
)。
其次,请记住 Drools 中规则的 LHS 有点像 SQL 语句。如果您未指定模式之间的任何关系,将使用它们的笛卡尔积。
希望对您有所帮助
规则的 No-Loop 属性确保当在 then 语句中更新/修改 when 条件中使用的相同对象时,不会重新触发相同的规则。
定义无循环的方式如下:
rule "Rule1"
no-loop true