我有以下两条规则:
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天窗口)
答案 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中的一个错误,自那以后就修复了。