Drools规则仅针对插入的事件触发

时间:2016-03-15 10:32:33

标签: java drools drools-fusion drools-flow

我对每个发送计步器数据的传感器有多种用途。我有一个基于macAddress的规则文件,触发规则:

declare Steps
    @role(event)
end

declare User
    @role(fact)
end

rule "MAC"
when
  User( $mac: macAddress ) from entry-point "entrySteps"
then end

rule "ACC STEPS RULE" extends "MAC"
when
    accumulate( Steps( $s : steps , macAddress == $mac )
            over window:time( 1h ) from entry-point "entrySteps"; 
        $fst: min( $s ), $lst: max( $s );
        $lst - $fst < 50 )
then
    System.out.println($lst + "   " + $fst);
    Action.handleAction($mac,"STEPS RULE: get moving!");
end

我的用户只有一个字段macAddress,而且各个步骤事件包含以下字段:

double steps;
Date timeStamp;
String macAddress;

现在,当我为每个 macAddress插入事件然后时,如果在过去一小时内具有该macAddress的用户的步数小于50,则该规则将触发。因此该规则将触发对于每个macAddress,如果满足此条件。 但我希望规则只能触发插入的Step事件的macAddress。我该如何调整我的规则?

1 个答案:

答案 0 :(得分:1)

奇怪的是,当只有一个用户而没有该用户的步骤时,也就是说,该窗口是空的。输出包含最小和最大双精度值 - 不确定这是否是Drools中的错误。

作为解决方法,添加累计计数的测试,可能大于0或更大。

accumulate( Steps( $s : steps , macAddress == $mac )
        over window:time( 1h ) from entry-point "entrySteps";
    $fst: min( $s ), $lst: max( $s ), $cnt: count( $s );
    $cnt > 0, $lst - $fst < 50 )