drools-слияние, не вызывающее события из рабочей памяти, когда это необходимо

StackOverflow https://stackoverflow.com/questions/4561685

Вопрос

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

Эдсон

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top