我有以下两条规则:
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天窗口)
发布于 2012-12-20 13:14:39
原来是drools中的一个bug,后来修复了。
发布于 2011-01-29 00:05:33
根据您的描述,在您的示例中,"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版本。
埃德森
https://stackoverflow.com/questions/4561685
复制相似问题