drools fusion不会在应该的时候从工作记忆中删除事件

drools fusion不会在应该的时候从工作记忆中删除事件,drools,complex-event-processing,drools-fusion,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" )

我有以下两条规则:


    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
还有一个“压力测试”,每天生成10000个这样的备份,并模拟50天。考虑到上述所有规则都是指一个3天的窗口,并且系统中没有其他规则,50天后内存中最多应该有30K个事件(更少,因为成功的事件应该被删除)。然而,当我检查流入口点(一个WorkingMemoryEntryPoint)的内容时,我的内存中有大约380K个事件——这意味着我有一些非常旧的事件没有像应该的那样被自动逐出

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


declare Backup
    @role( event )
    @duration ( duration )
    @timestamp( finished )
end
因此,没有明确的生命周期管理。
我做错了什么?我知道这与规则#2有关,因为如果我删除它,我的内存中正好有30K个事件(每天10K*3天窗口)

根据您的描述,在您的示例中,“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版本


Edson

根据您的描述,在您的示例中,“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版本


Edson被证明是drools中的一个bug,自修复。

被证明是drools中的一个bug,自修复。

最终我成功地重现了这个问题,没有任何操作员参与:。看起来仅仅使用同一个窗口两次就足以导致内存泄漏。最终,我成功地重现了这个问题,根本没有涉及任何运算符:。看起来仅仅使用同一个窗口两次就足以导致内存泄漏