私は次の2つのルールを持っています:
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
1 日あたり 10,000 のそのようなバックアップを生成し、50 日間をシミュレートする「ストレス テスト」。上記のすべてのルールが 3 日間のウィンドウを参照しており、システムに他のルールがない場合、50 日後にメモリ内のイベントは最大で 30K になるはずです (成功したイベントは削除する必要があるため、それより少なくなります)。ただし、ストリーム エントリ ポイント (WorkingMemoryEntryPoint) の内容を確認すると、メモリ内に ~380K のイベントがあります。つまり、非常に古いイベントが自動的に削除されていません。
KB はストリーム処理モードで構成され、イベントは次のように定義されます。
declare Backup
@role( event )
@duration ( duration )
@timestamp( finished )
end
したがって、明示的なライフサイクル管理はありません。私は何を間違っていますか?ルール#2と関係があることはわかっています。これを削除すると、メモリ内に正確に30Kのイベントが発生するためです(1日10K * 3日のウィンドウ)