我有以下两条规则:
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 天窗口)