Необходимо убедиться, что побочный эффект правила передан обратно вызывающей стороне. Как вы это сделаете, зависит от вашего конкретного набора правил и объектов, которые вы передаете в него.
Например, одним из решений может быть изменение значения объекта, имеющегося у вас в рабочей памяти.
rule "Example rule changing a value"
when
$purchase: Purchase( includesAlcohol == true )
then
$purchase.shouldIncludeExciseTax(true); // set a value on the object in working memory.
end
Другой вариант, который некоторые считают не очень хорошей практикой, будет использовать глобальный. Это было довольно распространенным явлением в Drools 5.0 и более ранних днях.
global Discounts appliedDiscounts;
rule "Example rule setting a property on a global"
when
DiscountCode( value == "FOOBAR~DISCOUNT" )
then
appliedDiscounts.addDiscount( 0.3 );
end
В основном все, что вы делаете с правой стороны, должно быть видно вызывающему. В первом примере у вас все еще должна быть ссылка на объект, который вы вставили в рабочую память, когда вызывали правила. Таким образом, после выполнения правил sh вы сможете взять эту ссылку и запросить значения из нее.
Во втором примере аналогичным образом используется объект, переданный в правила, но в качестве глобального, а не в рабочей памяти. Здесь есть тонкие различия между двумя при использовании сеанса с сохранением состояния, но они оба используют одни и те же основные принципы c.