Как вернуть значение из Cosequence файла drl в java - PullRequest
0 голосов
/ 03 марта 2020

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

1 Ответ

0 голосов
/ 05 марта 2020

Необходимо убедиться, что побочный эффект правила передан обратно вызывающей стороне. Как вы это сделаете, зависит от вашего конкретного набора правил и объектов, которые вы передаете в него.

Например, одним из решений может быть изменение значения объекта, имеющегося у вас в рабочей памяти.

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.

...