drools-fusion不应该在工作记忆中引发事件

时间:2010-12-30 10:01:45

标签: drools complex-event-processing drools-fusion

我有以下两条规则:


    rule "Backup Not Succeeded For At Least 3 Days"
    @ruleId(1)
    when
        Node($id : id)
        not ( Backup(clientId == $id, $state: state == BackupStateEnum.FINISHED) over window:time( 3d ) from entry-point "Backup Stream" )
    then
        //nothing for now
    end

    rule "Prune Previous Successful Backups"
    @ruleId(2)
    when
        $prevBackup  : Backup($id : clientId,  state == BackupStateEnum.FINISHED) over window:time( 3d ) from entry-point "Backup Stream"
        $newerBackup : Backup(clientId == $id, state == BackupStateEnum.FINISHED, this after $prevBackup) over window:time( 3d ) from entry-point "Backup Stream"
    then
        drools.retract($prevBackup);
    end

和“压力测试”,每天产生10K这样的备份,并模拟50天。鉴于所有上述规则都是指3天的窗口,并且系统中没有其他规则,50天后内存中最多应有30K事件(少,因为应该修剪成功的事件)。但是,当我检查流入口点(WorkingMemoryEntryPoint)的内容时,我在内存中有~380K事件 - 这意味着我有一些非常老的事件没有像他们应该那样被自动驱逐。

KB是在流处理模式下配置的,事件定义如下:


declare Backup
    @role( event )
    @duration ( duration )
    @timestamp( finished )
end

所以没有明确的生命周期管理。 我究竟做错了什么 ?我知道这与规则#2有关,因为如果我删除它,我会在内存中获得30K事件(每天10K * 3天窗口)

2 个答案:

答案 0 :(得分:0)

根据您的描述,“after”运算符与示例中的时间窗口之间可能存在不期望的交互。

在你的第二个规则中,你可以尝试转储使用滑动窗口并参数化“after”运算符,它应该达到你想要的效果。例如:

 rule "Prune Previous Successful Backups"
    @ruleId(2)
    when
        $prevBackup  : Backup($id : clientId,  state == BackupStateEnum.FINISHED) from entry-point "Backup Stream"
        $newerBackup : Backup(clientId == $id, state == BackupStateEnum.FINISHED, this after[0,3d] $prevBackup) from entry-point "Backup Stream"
    then
        drools.retract($prevBackup);
    end

在任何情况下,您都可以为Drools团队打开一个JIRA来调查滑动窗口和无参数“after”运算符之间的交互,如您所述。别忘了提到你正在使用的Drools版本。

埃德森

答案 1 :(得分:0)

原来是drools中的一个错误,自那以后就修复了。