我在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
你能告诉我出了什么问题。
答案 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 而不调用更新或修改,执行(我称之为)“脏更新”。