Пускает слюни: Почему опровергнутый факт все еще появляется в collect

#java #drools

#java #пускает слюни

Вопрос:

У нас есть следующий код из унаследованного проекта, и я пытаюсь понять, почему он выполняется так, как он выполняется.

У нас есть следующие 2 правила drools:

 // The purpose of this rule is to update a UI counter with the number of complete activities
rule "Activity Complete"
    dialect "java"
    no-loop
    when
        $log : Logger()
        [...]
        $acts : List( $numTransferred : size ) from collect( ActivityInstance(complete==true, [some more filtering stuff]))
    then
        $log.debug([dump information about all activities in $acts])
        [call necessary java code updating the UI counter to display $numTransferred]
end

rule "Purge Complete Activity Instances"
salience( -100 )
    when
        $log : Logger()
        $a : ActivityInstance(complete == true )
    then
       $log.debug([dump information about activity being retracted]);
       retract($a)
    end
 

Результатом выполнения этих правил в проекте является то, что счетчик постоянно увеличивается.
Вывод журнала:

 Activity Complete: $acts has size 1, contains Activity1
Purge: Activity1 has been retracted
Activity Complete: $acts has size 2, contains Activity1, Activity2
Purge: Activity2 has been retracted
...
 

Я не очень знаком с drools, но, насколько я понимаю, collect собирает факты из рабочей памяти, в то время как retract удаляет факты из рабочей памяти. Я ожидал бы, что этот код не будет работать должным образом, и счетчик должен навсегда застрять на 1, при этом правило более низкой значимости всегда удаляет завершенное действие из рабочей памяти после его использования в правиле значимости по умолчанию.

Любая помощь в понимании того, почему этот код дает такие результаты, была бы признательна, спасибо!

Комментарии:

1. retract удаляет факты из рабочей памяти и запускает частичную переоценку правил, чтобы определить, действительны ли теперь новые правила для запуска, или если старые ранее согласованные правила недействительны.

2. На самом деле, подумайте об этом — как вы используете эти правила? Если вы продолжаете передавать Activity1 обратно в рабочую память при каждом последующем вызове, он будет продолжать отображаться.

3. Спасибо за ответ, тем временем мы выяснили, что эти правила фактически запускаются из разных сеансов, которые, я полагаю, имеют отдельную рабочую память. Это фактически открыло некоторые другие вопросы, хотя они отделены от этого сообщения