#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. Спасибо за ответ, тем временем мы выяснили, что эти правила фактически запускаются из разных сеансов, которые, я полагаю, имеют отдельную рабочую память. Это фактически открыло некоторые другие вопросы, хотя они отделены от этого сообщения