流口水:相同情况下两次开除

时间:2019-02-02 20:52:35

标签: java drools rule-engine

尽管只有一种匹配的情况,此规则也会触发两次。我使用Drools 6.5.0。最后。查看日志,它需要$卡2为$卡1,反之亦然在第二轮。

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 个答案:

答案 0 :(得分:0)

首先,您的规则对我来说似乎不正确。前两个模式缺少其类型,并且有一些变量(即name1)不是来自任何地方。

第二,请记住,Drools中的规则的LHS有点像SQL语句。如果您在模式之间未指定任何关系,则将使用它们的笛卡尔积。

希望有帮助

答案 1 :(得分:0)

规则的No-Loop属性可确保在then语句中发生when条件的同一对象的更新/修改时,不会重新触发同一规则。

定义无环的方法如下:

rule "Rule1"
no-loop true