drools-fusion не извлекает события из рабочей памяти, когда это необходимо - PullRequest
2 голосов
/ 30 декабря 2010

У меня есть следующие 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-дневному окну, и в системе нет других правил, в памяти должно быть не более 30 КБ событий через 50 дней (меньше, поскольку успешные должны быть удалены). однако, когда я проверяю содержимое точки входа в поток (WorkingMemoryEntryPoint), у меня в памяти происходит ~ 380 КБ событий, что означает, что у меня есть очень старые события, которые не удаляются автоматически, как они должны.

КБ был настроен в режиме потоковой обработки, а событие определяется следующим образом:


declare Backup
    @role( event )
    @duration ( duration )
    @timestamp( finished )
end

, поэтому нет явного управления жизненным циклом. Что я делаю неправильно ? я знаю, что это как-то связано с правилом № 2, потому что, если я удаляю его, я получаю в памяти ровно 30 тыс. событий (10 тыс. в день * 3-дневное окно)

Ответы [ 2 ]

0 голосов
/ 20 декабря 2012

оказалась ошибкой в ​​слюнях, исправлена ​​с тех пор.

0 голосов
/ 28 января 2011

По вашему описанию может возникнуть нежелательное взаимодействие между оператором "после" и временным окном в вашем примере.

Во втором вашем правиле вы можете попытаться избавиться от использования скользящих окон и параметризировать оператор "после", и это должно достичь желаемого эффекта. Пример:

 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, чтобы исследовать взаимодействие между скользящим окном и безпараметрическим оператором «после», как вы описали. Не забудьте упомянуть версию Drools, которую вы используете.

Эдсон

...