使用修改/更新会创建不一致的数据

时间:2015-03-07 17:19:28

标签: updates drools

我在List中获得了不一致的数据,列表中的数据在规则1中添加。规则2修改了保存列表的对象,因为更新/修改规则被重复调用。

rule "Rule 1"
dialect "java"
no-loop true
when
    $notification:NotificationVO();
    $snrData : SensorDataVO(getOffsetChngesInterval()!=null,
                            getOffsetChngesInterval().size()>0);
    $pestWeight:Integer() from $snrData.getOffsetChngesInterval();
    $masterData: MasterDataVO($pestWeight==rodentWeight);
then
    System.out.println("Rule 2");
    modify($notification){getFilteredMasterData().add($masterData)};
end

rule "Rule 2"
dialect "java" 
no-loop true
when
    $notification: NotificationVO(getFilteredMasterData()!=null,
                                  getFilteredMasterData().size()>3,
                                  getReasoningData().size()==0);
then
  System.out.println("Rule 3");
  modify($notification) {
    getReasoningData().put($notification.getFilteredMasterData().get(0)
 .getRodentWeight(),
                           $notification.getFilteredMasterData().get(0))
  }
end

你能告诉我出了什么问题。

1 个答案:

答案 0 :(得分:0)

这很简单:只要修改了一个事实,就会再次评估引用该事实的所有规则,如果条件为真,则会导致另一个激活。

要打破这种恶性循环,你有几个选择,但在这两个规则上使用no-loop不是其中之一。

首先,您可以添加在事实数据中未给出其右侧建立的规则之一的条件。因此,当Rule 1$masterData添加到列表filteredMasterData时:添加列表中不存在此元素的约束:

when
  $notification:NotificationVO( $fmd: filteredMasterData)
  $snrData : SensorDataVO(getOffsetChngesInterval()!=null,
                          getOffsetChngesInterval().size()>0)
  $pestWeight:Integer() from $snrData.getOffsetChngesInterval()
  $masterData: MasterDataVO($pestWeight==rodentWeight)
  eval( ! $fmd.contains( $masterData ) )
then

另一种可能性取决于使用Rule 2中更新的Map reasoningData。如果未在任何条件下使用,您只需修改Map 而不调用更新或修改,执行(我称之为)“脏更新”。