drools-слияние, не вызывающее события из рабочей памяти, когда это необходимо
-
14-10-2019 - |
Вопрос
у меня есть следующие 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
и "стресс-тест", который генерирует 10 Тысяч таких резервных копий в день и имитирует 50 дней.учитывая, что все вышеприведенные правила относятся к 3-дневному окну, а других правил в системе нет, через 50 дней в памяти должно быть не более 30 тысяч событий (меньше, поскольку успешные из них должны быть удалены).однако, когда я проверяю содержимое точки входа потока (WorkingMemoryEntryPoint), у меня в памяти ~ 380 тыс. событий - это означает, что у меня есть некоторые очень старые события, которые не удаляются автоматически, как они должны.
КБ было настроено в режиме потоковой обработки, и событие определяется следующим образом:
declare Backup
@role( event )
@duration ( duration )
@timestamp( finished )
end
таким образом, нет явного управления жизненным циклом.что я делаю не так ?я знаю, что это как-то связано с правилом № 2, потому что, если я удалю его, я получу ровно 30 тысяч событий в памяти (10 тысяч в день * 3-дневное окно)
Решение 2
оказалось, это ошибка в drools, исправленная с тех пор.
Другие советы
Похоже, что по вашему описанию может быть нежелательное взаимодействие между оператором «после» и временным окном в вашем примере.
Во втором правиле вы можете попробовать сбросить использование скользящих окон и параметризировать оператор «после», и он должен достичь того эффекта, который вы ищете. Пример:
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
В любом случае, вы можете открыть JIRA для команды Drools, чтобы исследовать взаимодействие между скользящим окном и без параметра »после« оператора », как вы описали. Не забудьте упомянуть версию слюни, которую вы используете.
Эдсон