У меня проблема, когда после того, как я установил для объекта значение «FAILED» в первом правиле, но при запуске второго правила значение по-прежнему указывает на исходное значение, которое является «PASS». Обратите внимание, что значение передается от клиента kie.
rule "1st rule"
dialect "java"
when
$ruleEngine:RuleEngine()
then
OutputObject outputObject = new OutputObject();
outputObject.setResult("FAIL" );
$ruleEngine.setOutputObject(outputObject);
insert ($ruleEngine);
end
rule "2nd rule"
dialect "java"
when
$ruleEngine:RuleEngine(
( String.valueOf($ruleEngine.getOutputObject.getResult()).equals("PASS") ) //=====> the value is still PASS
)
then
System.out.println("output object= = " + $ruleEngine.getOutputObject().getResult().equals("FAIL")); // ===> is true
System.out.println("output object:" + $ruleEngine.getOutputObject().getResult()); // ==> object is FAIL ?? Why?
end
Вывод правила
output object==true
output object:FAIL
Вопрос 1) Почему значение результата установлено на "FAIL", но выполняется 2-е правило во время проверки "when", тогда значение результата все еще "PASS"
Вопрос 2) Как я могу получить значение результата, установленное как «FAIL» во время проверки 2-го правила «when»?




В Drools есть специальная «функция» для изменения фактов, и это не insert. Что вы делаете в первом правиле, так это снова вставляете факт в сеанс (вызывая путаницу для Drools). Вы ищете метод modify:
rule "1st rule"
dialect "java"
when
$ruleEngine:RuleEngine(outputObject!.result != "FAIL")
then
OutputObject outputObject = new OutputObject();
outputObject.setResult("FAIL" );
modify($ruleEngine){
setOutputObject(outputObject)
};
end
rule "2nd rule"
dialect "java"
when
$ruleEngine:RuleEngine( outputObject!.result == "PASS" )
then
//...
end
Надеюсь, поможет,
Точно так же, как insert потенциально вызовет оценку всех ваших правил, modify будет работать точно так же. После изменения факта все правила, относящиеся к этому факту, будут повторно оценены (включая то же правило, которое изменило объект). Так работает логический вывод в Drools (и других механизмах правил). Обратите внимание, что я изменил условие в первом правиле, чтобы оно не запускалось повторно при изменении. Если вы не хотите, чтобы Drools узнал о модификации, просто не используйте операцию modify.
В слюнях есть более продвинутые функции, такие как реактивное свойство, которые вы также можете использовать, чтобы избежать повторного выполнения ваших правил. Вы можете взглянуть на руководство.
Здесь нет ничего хорошего. Когда мне удалось установить функцию изменения, как вы предложили. Он отлично работает на eclipse, но работает с drool core api 6.0.1, но не работает на drools core api 7.5 с использованием swagger и Kie Server.
Привет, когда я добавил функцию изменения, правилом было продолжать перезагружать .. В документации упоминается использование модификации, но я не совсем понимаю, почему она будет перезагружать все снова и снова. Во-первых, важно понять, почему вы бы использовали вышеуказанный шаблон. У вас может быть много правил в разных группах потока правил. Когда правила изменяют рабочую память и другие правила, расположенные ниже вашего RuleFlow (в разных группах потока правил), необходимо переоценить, использование модификации имеет решающее значение. Однако вы не хотите, чтобы другие правила в той же группе потока правил рекурсивно накладывали активации друг на друга.